Java Apache commons io FileUtils.deleteDirectory工作不正常

Java Apache commons io FileUtils.deleteDirectory工作不正常,java,io,apache-commons-io,Java,Io,Apache Commons Io,我对commons ioFileUtils.deleteDirectory(文件)有问题。我只是打电话 FileUtils.deleteDirectory(new File("/tmp/dir")); 目录结构为: tmp/ - dir/ - a/ - b/ - c.txt 我尝试调试它,结果如下: 在删除c.txt之前,我停止FileUtils中的程序如果(!file.delete()) 文件存在,我可以重命名它(我想它没有被锁定) file.d

我对commons io
FileUtils.deleteDirectory(文件)
有问题。我只是打电话

FileUtils.deleteDirectory(new File("/tmp/dir"));
目录结构为:

tmp/
 - dir/
    - a/
       - b/
          - c.txt
我尝试调试它,结果如下:

  • 在删除c.txt之前,我停止FileUtils中的程序<代码>如果(!file.delete())
  • 文件存在,我可以重命名它(我想它没有被锁定)
  • file.delete()
  • 我在删除b/目录之前停止程序<代码>如果(!directory.delete())
  • c、 txt仍然存在于该目录中,目录上的
    delete()
    返回false,并引发“无法删除目录/tmp/dir/a/b/”异常
  • 当程序结束时,文件被删除,但b/、a/、dir/目录不被删除
  • 对我来说,奇怪的行为是c.txt文件在删除后存在,并且在其父目录上调用delete会导致错误。该文件仅由Java程序使用。有什么建议吗?如果某些文件处理程序仍然打开,您知道如何在Java中进行检查吗

    更新:已修复

    我是个愚蠢的混蛋,我再次检查了我的代码,发现我错过了之前读取文件的close stream。我有一个读取输入的代码:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    InputStream is = new FileInputStream(new File("/tmp/dir/a/b/c.txt"));
    IOUtils.copy(is, baos); 
    String content = new String(baos.toByteArray());
    
    我改为(现在可以了):


    这只是一个例子,我知道正确关闭所有流(使用try finally)很重要。BufferedInputStream在这里也应该很有用。

    No
    IOException
    被抛出?是的,这在64位Windows 7上发生。没有例外,一切都很顺利。与其编辑你的问题以包含答案,不如发布答案。
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    InputStream is = new FileInputStream(new File("/tmp/dir/a/b/c.txt"));
    IOUtils.copy(is, baos);
    // Close streams!
    baos.flush();
    baos.close();
    is.close(); // This is the most important!
    String content = new String(baos.toByteArray());