2

我对 commons-io 有疑问FileUtils.deleteDirectory(File)。我只是打电话

FileUtils.deleteDirectory(new File("/tmp/dir"));

目录结构为:

tmp/
 - dir/
    - a/
       - b/
          - c.txt

我尝试使用以下结果进行调试:

  1. 在删除 c.txt 之前,我在 FileUtils 中停止了程序。if (!file.delete())
  2. 文件存在,我可以重命名它(我猜它没有被锁定)。
  3. file.delete()返回true,程序以正常方式继续(文件仍然存在,但现在我无法重命名它)
  4. 我在删除 b/ 目录之前停止程序。if (!directory.delete())
  5. c.txt 仍然存在于此目录中,并且delete()在目录上返回 false 并引发“无法删除目录 /tmp/dir/a/b/”异常
  6. 当程序结束时,文件被删除,但 b/、a/、dir/ 目录不会。

对我来说奇怪的行为是 c.txt 文件在删除后存在,然后在他的父目录上调用 delete 会导致错误。该文件仅供 Java 程序使用。有什么建议么?如果某些 FileHandlers 仍然为文件打开,知道如何检查 Java 吗?

更新:已修复

我是个笨蛋,我再次检查了我的代码,发现我错过了之前读取文件的关闭流。我有一个读取输入的代码:

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

我改为(现在可以使用):

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

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

4

0 回答 0