无法删除由java Transformer创建的文件
无法删除由java Transformer创建的文件,java,xml,Java,Xml,我以以下方式使用java中的Transformer类- 1 Transformer transformerFinal = tFactory.newTransformer(new StreamSource(finalStylesheet)); 2 transformerFinal.setParameter("Date", sdf.format(myDate)); 3 transformerFinal.transform(new StreamSource(tempFilename), n
我以以下方式使用java中的Transformer类-
1 Transformer transformerFinal = tFactory.newTransformer(new StreamSource(finalStylesheet));
2 transformerFinal.setParameter("Date", sdf.format(myDate));
3 transformerFinal.transform(new StreamSource(tempFilename), new StreamResult(new FileOutputStream(finalFilename)));
然后我想删除这个用于转换的源文件
4 File fileToDelete = new File(tempFilename);
5 fileToDelete.delete();
它不工作,我的意思是文件不会被删除。但是如果在
第3行
我传递一个o/p流的局部变量,即
1 FileOutputStream fos = new FileOutputStream(finalFilename);
4 transformerFinal.transform(new StreamSource(tempFilename), new StreamResult(fos));
5 fos.close();
现在删除功能开始工作,它确实删除了文件。那么,当我得出结论,o/p流在
转换过程中没有隐式关闭时,我是对的吗?因此,我必须明确地关闭流。
如果有任何其他原因导致文件无法删除,请任何人共享
请假设所有变量都有正确的值
多谢各位
更新
还有一件事我注意到了。
我从另一个类调用此代码,例如-
public class ClassTwo {
public void ameth(String tempFilename) {
// the above mentioned transformation code
}
}
1 public class ClassOne {
2 public void method1() {
3 ClassTwo ct = new ClassTwo();
4 ct.ameth("tempFilename1");
5 ct.ameth("tempFilename2");
6 }
7 }
在这里,当我没有明确关闭流时,它确实删除了tempFilename2
,但没有删除tempFilename1
你知道为什么会这样吗?你是对的:你不能删除一个仍然打开的文件。由于Java API中的一个老错误,delete()
无法告诉您原因——它只能返回一个boolean
结果
这种行为的原因是Java不能自动清理堆内存以外的系统资源。因此,我们最终遇到了一个问题:谁可以安全地关闭该文件?也许转变还没有完成。或者您需要在同一个流中编写页眉+页脚
因此,如果您创建了一个流,您总是必须关闭它。谢谢您的解释。如果我理解正确,您是说不关闭transform()
中的流是故意的,出于安全原因,这是留给用户来确保的。很公平。但是,我觉得它应该在Java文档中提到。@Swift-Tuttle:它可能在标准Java I/O API中的某个地方提到过。因为每个人都是这样做的,所以没有必要反复提及。谢谢。我已经用我注意到的一些东西更新了这个问题,如果可能的话,请你发表评论。没有更多的信息真的很难说。那是Linux、Mac还是Windows?在Windows上,您可能在编辑器中打开了文件。是否涉及线程?也许GC运行并收集了锁…它是在Windows XP上运行的。没有显式线程,只是一个普通的java程序。我会四处看看,然后再跑一次,试着看看是否可以复制。再次非常感谢。@adarshr:行号禁用了从这里复制并粘贴代码的功能。