无法删除java Transformer创建的文件

Swi*_*tle 4 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), 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.
任何想法,为什么它表现如此?

Aar*_*lla 5

你是对的:你不能删除仍然打开的文件.由于Java API中的旧错误,delete()无法告诉您原因 - 它只能返回boolean结果.

此行为的原因是Java无法自动清理堆内存以外的系统资源.所以我们最终遇到了问题:谁可以安全地关闭文件?也许转型尚未完成.或者您需要在同一个流中编写标题+页脚.

所以,如果创建一个流,总是要关闭它.