我以下列方式在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)));
Run Code Online (Sandbox Code Playgroud)
然后我想删除用于转换的源文件.
4 File fileToDelete = new File(tempFilename);
5 fileToDelete.delete();
Run Code Online (Sandbox Code Playgroud)
它不起作用,我的意思是该文件不会被删除.
但是,如果在line 3我传递o/p流的局部变量即.
1 FileOutputStream fos = new FileOutputStream(finalFilename);
4 transformerFinal.transform(new StreamSource(tempFilename), new StreamResult(fos));
5 fos.close();
Run Code Online (Sandbox Code Playgroud)
现在删除功能有效,它确实删除了该文件.
所以,我是否正确,当我得出结论,在此transform过程中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 }
Run Code Online (Sandbox Code Playgroud)
在这里,当我没有显式关闭流时,它确实删除了tempFilename2但不是tempFilename1.
任何想法,为什么它表现如此?
你是对的:你不能删除仍然打开的文件.由于Java API中的旧错误,delete()无法告诉您原因 - 它只能返回boolean结果.
此行为的原因是Java无法自动清理堆内存以外的系统资源.所以我们最终遇到了问题:谁可以安全地关闭文件?也许转型尚未完成.或者您需要在同一个流中编写标题+页脚.
所以,如果你创建一个流,你总是要关闭它.