6

我目前在我的 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();
            }
        }
}

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

4

7 回答 7

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

更新

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

更新

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

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

于 2012-08-23T16:24:20.533 回答
1

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

在我的情况下,在创建文件、写入其 FileOutputStream 和删除文件之间的某个地方,我正在使用 FileInputStream 并忘记为它调用 close() 。

所以,也许在你的代码中的某个地方,你将另一个流附加到这个文件,并让它保持打开状态。

在找到问题的真正根源之前,我使用了一个简单的技巧来临时解决这个问题:

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

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

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

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

于 2013-06-27T10:44:14.077 回答
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。感谢您的启发。

于 2013-07-30T11:00:15.667 回答
0

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

name.close()

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

于 2012-08-23T16:23:05.580 回答
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() );
于 2012-08-23T16:31:02.263 回答
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. 我无法在java中删除文件
  2. Java 'file.delete()' 没有删除指定的文件!
  3. Java 6 文件删除
于 2012-08-23T16:27:49.447 回答
0

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

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

高温高压

于 2017-12-01T19:55:18.607 回答