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