JDOM `SaxBuilder` 未发布格式错误的文件
JDOM `SaxBuilder` not releasing the malformed file
在我的应用程序中,我正在检查 xml 文件中的一个值,例如 some.xml
并根据读取结果将该文件移动到另一个目录。
当 some.xml
格式错误时,SaxBuilder
会抛出 JDOMException
,但不会释放文件。当我试图在那之后移动 some.xml
时,我得到了 some.xml
被另一个进程使用的错误。
我的代码是这样的(删除了不相关的细节):
private static String getName(Path fullPath) {
File f = fullPath.toFile();
SAXBuilder saxBuilder = new SAXBuilder();
Document doc = null;
String result = "";
try {
doc = saxBuilder.build(f);
result = doc.getRootElement().getChild("imageControl").getText();
} catch (JDOMException | IOException e) {
e.printStackTrace();
}
return result;
}
so - 在 运行 之后,在传入错误信息 xml 时,该错误信息 xml 文件仍由 SaxBulider 打开 - 无法在我的后续操作中移动它方法。
如何解决这个问题?
我现在唯一能想到的就是制作一份 xml 的临时副本,然后在副本上进行上述阅读。但这远不是最好的事情。
我在 Java 1.7
上使用 JDOM 2.0.6
TIA。
//----------------------------
编辑:
相应行中的以下修复没有成功:
try (InputStream is = new FileInputStream(f)){
doc = saxBuilder.build(f);
这个方法肯定有问题。当我注释掉它的调用时,这都是 运行 预期的方式。
//---------------------------------------- ----
编辑-2
不对 - 打字错误。
try (InputStream is = new FileInputStream(f)){
doc = saxBuilder.build(is);
有效。
SaxBuilder 似乎没有关闭资源,所以请尝试使用 build(InputStream)
或 build(Reader)
方法,并在 finally 块中显式关闭 stream/reader。
我同意@Jim Garrison 的观点,JDOM 可能会在出现异常时忘记关闭输入。
在我的应用程序中,我正在检查 xml 文件中的一个值,例如 some.xml
并根据读取结果将该文件移动到另一个目录。
当 some.xml
格式错误时,SaxBuilder
会抛出 JDOMException
,但不会释放文件。当我试图在那之后移动 some.xml
时,我得到了 some.xml
被另一个进程使用的错误。
我的代码是这样的(删除了不相关的细节):
private static String getName(Path fullPath) {
File f = fullPath.toFile();
SAXBuilder saxBuilder = new SAXBuilder();
Document doc = null;
String result = "";
try {
doc = saxBuilder.build(f);
result = doc.getRootElement().getChild("imageControl").getText();
} catch (JDOMException | IOException e) {
e.printStackTrace();
}
return result;
}
so - 在 运行 之后,在传入错误信息 xml 时,该错误信息 xml 文件仍由 SaxBulider 打开 - 无法在我的后续操作中移动它方法。
如何解决这个问题?
我现在唯一能想到的就是制作一份 xml 的临时副本,然后在副本上进行上述阅读。但这远不是最好的事情。
我在 Java 1.7
上使用 JDOM 2.0.6TIA。
//----------------------------
编辑:
相应行中的以下修复没有成功:
try (InputStream is = new FileInputStream(f)){
doc = saxBuilder.build(f);
这个方法肯定有问题。当我注释掉它的调用时,这都是 运行 预期的方式。
//---------------------------------------- ----
编辑-2
不对 - 打字错误。
try (InputStream is = new FileInputStream(f)){
doc = saxBuilder.build(is);
有效。
SaxBuilder 似乎没有关闭资源,所以请尝试使用 build(InputStream)
或 build(Reader)
方法,并在 finally 块中显式关闭 stream/reader。
我同意@Jim Garrison 的观点,JDOM 可能会在出现异常时忘记关闭输入。