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

时间:2012-08-23 16:17:03

标签: java delete-file fileoutputstream

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

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

在我的汇总代码下面:

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

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

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();
            }
        }
}

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

7 个答案:

答案 0 :(得分:13)

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

outFile = null;
System.gc();

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

<强>更新

对我来说,它有效:

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();
    }
}

<强>更新

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

<强>更新

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

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

答案 1 :(得分:1)

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

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

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

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

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

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

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

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

答案 2 :(得分:0)

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

name.close()

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

答案 3 :(得分:0)

您可以尝试此代码..

    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. I can't delete a file in java
  2. Java 'file.delete()' Is not Deleting Specified File!
  3. Java 6 File Deletion

答案 4 :(得分:0)

最好使用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() );

答案 5 :(得分:0)

并非真正相关,但是:

这个关闭文件的解决方案帮助我解决了另一个问题。当从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.感谢您的灵感。

答案 6 :(得分:0)

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

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