我对 commons-io 有疑问FileUtils.deleteDirectory(File)
。我只是打电话
FileUtils.deleteDirectory(new File("/tmp/dir"));
目录结构为:
tmp/
- dir/
- a/
- b/
- c.txt
我尝试使用以下结果进行调试:
- 在删除 c.txt 之前,我在 FileUtils 中停止了程序。
if (!file.delete())
- 文件存在,我可以重命名它(我猜它没有被锁定)。
file.delete()
返回true
,程序以正常方式继续(文件仍然存在,但现在我无法重命名它)- 我在删除 b/ 目录之前停止程序。
if (!directory.delete())
- c.txt 仍然存在于此目录中,并且
delete()
在目录上返回 false 并引发“无法删除目录 /tmp/dir/a/b/”异常 - 当程序结束时,文件被删除,但 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 在这里也应该有用。