Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法删除由java Transformer创建的文件_Java_Xml - Fatal编程技术网

无法删除由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:行号禁用了从这里复制并粘贴代码的功能。