在下面的代码中,我尝试从ArrayList xmls中选择xml文件,其中xmls.get(i)是扩展名为.xml的文件的绝对路径。如果文档无法解析此文件,则抛出异常并将文件移动到其他目录。但是,我无法移动或删除文件,尽管我可以将其复制到目录destFile。最后一个if语句的值对f.exists()
,f.canRead()
,f.canWrite(
),f.canExecute
返回true,但对f.renameTo(destFile);
for(int i=0; i<xmls.size(); i++){
boolean delete = false;
try {
File f = new File(xmls.get(i));
File destFile = new File(structDir + "/badXMLs/" + f.getName());
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(f);
doc.getDoctype();
} catch (Exception e) {
File f = new File(xmls.get(i));
File destFile = new File(structDir + "/badXMLs/" + f.getName());
System.out.println(f.getName());
delete = true;
}
if(delete){
File f = new File(xmls.get(i));
File destFile = new File(structDir + "/badXMLs/" + f.getName());
System.out.println(f.exists());
System.out.println(f.canRead());
System.out.println(f.canWrite());
System.out.println(f.canExecute());
System.out.println(f.renameTo(destFile));
}
}
答案 0 :(得分:3)
当您收到异常时,默认的DocumentBuilder不会关闭该文件。避免这种情况的最简单方法是使用FileInputStream,并自行关闭它,如:
FileInputStream fis = null;
try {
File f = new File(xmls.get(i));
File destFile = new File(structDir + "/badXMLs/" + f.getName());
fis = new FileInputStream(f);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(fis); // parse the FileInputStream, not the File
doc.getDoctype();
} catch (Exception e) {
if (fis != null) {
fis.close();
}
File f = new File(xmls.get(i));
File destFile = new File(structDir + "/badXMLs/" + f.getName());
System.out.println(f.getName());
delete = true;
}
它不会关闭它,所以至少在Windows下,你不能删除它或重命名它。请注意,您不需要每次都创建DocumentBuilder。
答案 1 :(得分:1)
不确定建议你在文件对象上调用close()的答案,因为java.io.File没有这样的方法,但我认为它们正朝着正确的方向前进。
我建议切换到使用FileInputStream并关闭它。
parse方法可以采用File对象或FileInputStream,这样就可以了。