我会先发布我的代码:
private void validateXml(String xml) throws BadSyntaxException{
File xmlFile = new File(xml);
try {
JaxbCommon.unmarshalFile(xml, Gen.class);
} catch (JAXBException jxe) {
logger.error("JAXBException loading " + xml);
String xmlPath = xmlFile.getAbsolutePath();
System.out.println(xmlFile.delete()); // prints false, meaning cannot be deleted
xmlFile.delete();
throw new BadSyntaxException(xmlPath + "/package.xml");
} catch (FileNotFoundException fne) {
logger.error("FileNotFoundException loading " + xml + " not found");
fne.printStackTrace();
}
}
您可以在我的评论中看到我打印的文件无法删除。无法从try
/ catch
删除文件?因此,如果存在包含错误xml语法的文件,我想删除catch
中的文件。
编辑:当我从此函数外部使用delete()
时,我可以删除该文件。我在Windows上。
答案 0 :(得分:1)
确保在发生异常时此方法调用JaxbCommon.unmarshalFile(xml, Gen.class);
关闭任何流。如果正在读取文件的流处于打开状态,则无法将其删除。
答案 1 :(得分:0)
问题与try / catch无关。您是否有权删除该文件?
如果您使用的是Java 7,则可以使用我认为实际会抛出IOException的Files.delete(Path)
以及无法删除文件的原因。
答案 2 :(得分:0)
对try / catch块使用java.io.File.delete()
没有一般限制。
许多java.io.File
方法的行为可能取决于运行应用程序的平台/环境。这是因为他们需要访问文件系统资源。
例如,以下代码在Windows 7上返回false
,在Ubuntu 12.04上返回true
:
public static void main(String[] args) throws Exception {
File fileToBeDeleted = new File("test.txt");
// just creates a simple file on the file system
PrintWriter fout = new PrintWriter(fileToBeDeleted);
fout.println("Hello");
fout.close();
// opens the created file and does not close it
BufferedReader fin = new BufferedReader(new FileReader(fileToBeDeleted));
fin.read();
// try to delete the file
System.out.println(fileToBeDeleted.delete());
fin.close();
}
因此,真正的问题可能取决于几个因素。但是,它与驻留在try / catch块上的代码无关。
也许,您尝试删除的资源已打开,未被其他进程关闭或锁定。