java - 在验证( Java ) 失败后,io移动文件

  显示原文与译文双语对照的内容
58 4

我们正在验证XML文件,根据验证的结果,我们必须将文件移动到另一个文件夹。

当XML有效时,验证器返回一个值,我们可以在没有问题的情况下移动文件。当XML根据模式无效时也会发生同样的事情。

如果XML不正确形成,验证器会引发异常,当我们尝试移动文件时,它失败。我们相信记忆中仍然有一个句柄可以保存文件。我们试图在移动文件之前把 System.gc() 放在一起,但是我们不能把 System.gc() 作为解决方案。

代码看起来像这样。我们有一个文件对象,用于创建 StreamSource 。然后将StreamSource传递给验证器。当XML格式不好时,它抛出 SAXException 。在异常处理中,我们使用. renameTo() 方法来移动文件。

sc = new StreamSource(xmlFile);
validator.validate(sc);

在我们尝试的时候

validator.reset();
validator=null;
sc=null;

但是 .renameTo() 仍然无法移动文件。如果我们把 System.gc() 放在捕捉中,移动将会成功。

谁能给我enlight如何在没有 System.gc()?的情况下进行排序?

我们使用JAXP和 saxon- 9.1.0.8 作为解析器。

非常感谢

时间:原作者:0个回答

57 0

尝试创建 FileInputStream 并将它的传递到 StreamSource,然后在完成后关闭 FileInputStream通过传入 File,你已经失去了对如何关闭文件句柄的操作的控制。

原作者:
75 5

当你设置 sc = null 时,你将指示,文件不再被使用,并且可以以收集它。流在 destroy() 方法中关闭,因这里如果它们是垃圾收集,那么它们将被关闭,因这里可以以移动 Windows 系统。

为了解决这个问题,不用手工调用 GC,只需在 sc = null 之前调用 sc.getInputStream().close()这是好的实践。

常见的Pattern 是围绕任何文件处理使用来执行 try.. finally 块,例如。

try {
 sc = new StreamSource(xmlFile);
//check stuff
} finally {
 sc.getInputStream().close();
}
//move to the appropriate place

在 Java 7中,你可以以使用新的尝试使用资源,块。

原作者:
...