【问题标题】:Close a file created with FileOutputStream, for a next delete关闭使用 FileOutputStream 创建的文件,以便下次删除
【发布时间】:2012-08-23 16:17:02
【问题描述】:

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

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

【问题讨论】:

    标签: java delete-file fileoutputstream


    【解决方案1】:

    这是 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 块中的方法!

    【讨论】:

    • 我试过了,没用。我猜这是一个错误,是的,我在其他论坛上读到的。请问还有其他解决方案吗?你似乎知道这个话题=)
    • (是的,等一下,我试试。谢谢你的帮助)
    • 好的。不要忘记test.txt 应该存在于您的项目路径下:)
    • 是的,这个例子对我有用。我不知道我的有什么问题,也许是因为我没有在 finally 中刷新、关闭等?当我这样做时,需要在 finally 中添加一些 throw 或 try catch,这真的很奇怪
    • 是的,最后你也必须捕获异常。在我的示例中,我只是抛出了Exception,所以我不必处理它们^^,但它仅用于示例。我认为你应该处理它们。我添加了一段你可以使用的代码。
    【解决方案2】:

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

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

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      name.close()
      

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

      【讨论】:

      • 是的,我可以在它们关闭后删除它们,请阅读我自己的代码。
      【解决方案4】:

      你可以试试这个代码..

          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

      【讨论】:

      • 不,我也使用了 flush 我忘了添加它,但它不起作用......据我所知,这是一个错误,所以我正在寻找解决方案。
      • @user1619114 是对的。冲洗无济于事,因为它是一个错误
      • @user1619114 我不知道为什么它不适合你,因为它适合我。可能是您的文件在其他应用程序中打开。您是否使用某些编辑器打开它...?如果是,请在系统监视器中检查它,可能该应用仍在运行。
      • 不,它没有在其他地方打开:/ ...请看一下christian.vogel的回答,这似乎是一个已知的错误,但我不知道该怎么办!
      • 你的例子也对我有用(见我的回答)。我认为还有其他原因,它对他不起作用。
      【解决方案5】:

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

      【讨论】:

      • 您好,如您所见,是的,我使用了“deleteDirectory( path+"\\"+f[ j ] ); ”,或者我误解了您的建议?
      • 您需要下载库 commons.apache.org/io/download_io.cgi 并将 JAR 添加到您的类路径中
      • 好吧,我做到了,但同样的问题,我遇到了同样的异常:“java.io.IOException: Unable to delete file”
      【解决方案6】:

      不是很相关,但是:

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

      【讨论】:

        【解决方案7】:

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

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

        HTH

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-17
          • 1970-01-01
          • 2018-06-08
          • 2016-06-09
          • 1970-01-01
          • 2019-11-10
          相关资源
          最近更新 更多