file.delete()返回false,即使file.exists(),file.canRead(),file.canWrite(),file.canExecute()都返回true

Jen*_*ith 87 java file fileoutputstream

我正在尝试删除一个文件,在写完文件后,用FileOutputStream.这是我用来编写的代码:

private void writeContent(File file, String fileContent) {
    FileOutputStream to;
    try {
        to = new FileOutputStream(file);
        to.write(fileContent.getBytes());
        to.flush();
        to.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

如图所示,我刷新并关闭流,但是当我尝试删除时,file.delete()返回false.

我删除前检查,看看是否该文件存在,并且:file.exists(),file.canRead(),file.canWrite(),file.canExecute()所有返回true.在调用这些方法后,我尝试file.delete()返回false.

有什么我做错了吗?

小智 97

Java中的另一个错误.我很少找到他们,只是我10年职业生涯中的第二个.正如其他人所提到的,这是我的解决方案.我有幽冥使用过System.gc().但就我而言,这绝对是至关重要的.奇怪的?是!

finally
{
    try
    {
        in.close();
        in = null;
        out.flush();
        out.close();
        out = null;
        System.gc();
    }
    catch (IOException e)
    {
        logger.error(e.getMessage());
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然我没有使用任何类型的流打开它(只是做一个"新文件(路径)"),我遇到了同样的问题,并在`delete()之前添加`System.gc()`使其工作! (7认同)

Jen*_*ith 46

这个诀窍很奇怪.事情是我以前读过文件的内容,我用过BufferedReader.读完后,我关闭了缓冲区.

同时我换了,现在我正在阅读内容FileInputStream.完成阅读后,我关闭了流.现在它正在发挥作用.

问题是我对此没有解释.

我不知道BufferedReaderFileOutputStream不相容.

  • 这是2011年的JDK 7,问题仍然没有解决.我很高兴我找到了这个帖子 - 我根本无法弄清楚出了什么问题...... (14认同)
  • 我认为这是一个错误:http://java.sun.com/javase/6/docs/api/java/io/BufferedReader.html#close()它在那里说该方法应该关闭流和任何与之相关的资源.我通常喜欢使用IOUtils.closeQuietly关闭倒序列中的所有流(最后要打开的流是第一个要关闭的流),但它往往是矫枉过正. (4认同)
  • 我有这个确切的问题我和我以为我疯了.谢谢你的解决方案! (2认同)

Kis*_*nha 18

我尝试过这个简单的事情似乎很有效.

file.setWritable(true);
file.delete();
Run Code Online (Sandbox Code Playgroud)

这个对我有用.

如果这不起作用,请尝试使用sudo运行Java应用程序(如果在Linux上)和管理员运行Windows时.只是为了确保Java有权更改文件属性.


小智 5

在尝试删除/重命名任何文件之前,必须确保所有读者或编写者(例如:BufferedReader/ InputStreamReader/ BufferedWriter)都已正确关闭.

当您尝试从/向文件读取/写入数据时,该文件由进程保留,并且在程序执行完成之前不会释放.如果要在程序结束之前执行删除/重命名操作,则必须使用类close()附带的方法java.io.*.