关闭使用FileOutputStream创建的文件,以进行下一次删除

我目前在Java代码中遇到了FileOutputStream的问题。

实际上我使用FileOutputStream来创建文件,但是一旦创建了文件,就无法删除它。 据我所知,这可能来自FileOutputstream未关闭的事实。

在我的汇总代码下面:

outFile = new FileOutputStream(dir+"\\"+fileName); outFile.write("Test"); outFile.flush(); outFile.close(); outFile = null; System.gc(); 

然后就没有办法删除文件,即使是“手动”。 当我的程序启动时,我无法通过简单的del删除它在Windows上。 我还尝试删除文件夹目录的内容,但它也没有用,使用此代码:

 static public void delDir( String place ) { File path = new File( place ); System.out.println(path.exists());//return true if( path.exists() ) { File[] f = path.listFiles(); for( int j = 0 ; j < f.length ; j++ ) { if( f[ j ].isDirectory() ) { deleteDirectory( path+"\\"+f[ j ] ); } f[ j ].delete(); } } } 

所以我的问题是:如何关闭此文件以进行下一次删除(或者如果我们无法关闭它,如何正确删除它)?

这是Java中的一个错误。 是的它很少,但它们存在;)你可以在outFile.close()之后添加outFile.close()

 outFile = null; System.gc(); 

然后尝试删除它。 如果这不起作用,还有更多可能性。 让我知道。

UPDATE

对我来说它有效:

 public class FileDeleteExample { public static void main(String[] args) throws Exception { File f = new File("test.txt"); FileOutputStream outFile = null; try { outFile = new FileOutputStream(f); outFile.write("Test".getBytes()); } finally { outFile.flush(); outFile.close(); outFile = null; System.gc(); } f.delete(); } } 

UPDATE

我通过删除行outFile=null; System.gc;提到的例子Sumit Singh尝试了它outFile=null; System.gc; outFile=null; System.gc; 这对我来说也很有用。 所以FileOutputStream不应该有问题。 你能试试上面的小例子并说明它是否有效吗?

UPDATE

 void closeQuietly(FileOutputStream out) { try { out.flush(); out.close(); } catch(Exception e) {} } 

现在只需调用finally块中的方法!

我有同样的问题,delete()方法为我的文件返回false。

在我的情况下,在创建文件,写入其FileOutputStream和删除文件之间的某处,我使用的是FileInputStream,忘了为它调用close()。

因此,也许在您的代码中的某个地方,您将另一个流附加到此文件,并将其保持打开状态。

在找到问题的真正根源之前,我使用了一个simle hack来暂时解决这个问题:

 FileOutputStream fos = new FileOutputStream(myFile); fos.close(); myFile.delete(); 

在我的文件上调用delete之前,我在它上面创建了另一个FileOutputStream,然后调用了close()。

这将解锁此文件上的所有前置锁定,并允许您调用delete()。

这样做仍然不是一个好习惯。 您应该找出谁使用您的文件并以正确的方式解决它。

那么,关闭文件输出和输入流的方法是:

 name.close() 

你的删除代码看起来很好。 我的建议是使用FileIO而不是FileOutputStream,除非您使用FileOutputStream是有充分理由的。 程序关闭后你能删除文件吗?

你可以尝试这个代码..

  File file = new File(dir+"\\"+fileName); FileOutputStream outFile; try { outFile = new FileOutputStream(file); outFile.write("Test".getBytes()); outFile.flush(); outFile.close(); } catch (Exception e) { e.printStackTrace(); } file.delete(); 

您可以查看以下链接..

  1. 我无法删除java中的文件
  2. Java’file.delete()’没有删除指定的文件!
  3. Java 6文件删除

最好使用Apache Commons IO中的FileUtils.deleteDirectory 。 克服Java删除错误,减少使用的代码量,最重要的是,它可以工作。

而不是打电话

 delDir(place); 

只是打电话

 FileUtils.deleteDirectory(new File(place)); 

更新:在您的delDir方法中,您调用:

 deleteDirectory(new File(path + "\\" + f[j])); 

但结果

 File[] f = path.listFiles(); 

已包含文件中的路径,因此您可以使用:

 deleteDirectory( f[j].getPath() ); 

不是真的相关但是:

这个关闭文件的解决方案帮助我解决了另一个问题。 当从java 6运行程序时,新进程被暂停,直到我关闭我的应用程序(在java 7中它没问题)。 基于这个答案的解决方案有助于:

  String[] com = new String[]{javaRun, arg1, arg2, arg3, arg4}; Process proc = Runtime.getRuntime().exec(com, null, dir); proc = null; System.gc(); 

这适用于java 6.感谢您的灵感。

问题可能在第一行:outFile = new FileOutputStream(dir +“\”+ fileName);

  1. 不确定是否需要新的。
  2. 不要相信该目录应该包含在路径中。 AFAIK FileOutputStream的目录定义为app内部目录。

HTH