我知道这个问题是this问题的重复问题。 然而,我现在已经阅读了整个页面两次,有些部分已经阅读了3次,而对于我的生活,我看不出它是如何/在哪里被回答的!
所以,关于我的问题。
我正在工作,因使用Java 6 SE而无法升级到7.我正在编写一个程序来创建一个文件,写入它,进行一些处理,然后需要删除该文件。我遇到了与上面提到的问题的人完全相同的问题:Java不会删除文件,我无法弄清楚原因。
代码:
File f = null;
FileWriter fw = null;
try
{
f = new File("myFile.txt");
fw = new FileWriter(f);
fw.write("This is a sentence that should appear in the file.");
fw.flush();
if(f.delete())
System.out.println("File was successfully deleted.");
else
System.err.println("File was not deleted.");
}
catch(Exception exc)
{
System.err.println(exc.getMessage());
}
catch(Error er {
System.err.println(er.getMessage());
}
catch(Throwable t)
{
System.err.println(t.getMessage());
}
finally
{
fw.close();
}
它不会抛出任何抛出物,错误或异常(我包括那些排除任何和所有边缘情况)。第二个打印语句("File was not deleted."
)正在打印到控制台。我在Windows 7上运行此操作并正在写入我拥有完全权限(rwx)的文件夹。
用户问我引用的问题回答了他自己的问题,但是(以我的拙见)以一种不那么直接的方式这样做了。无论如何,我无法理解它。他/她似乎暗指使用BufferedReader
而不是FileInputStream
为他/她带来了不同,但我只是看不出它是如何适用的。
Java 7似乎已经通过引入java.nio.file.Files
类修复了这个问题,但同样,我不能将Java 7用于超出我控制范围的原因。
对该引用问题的其他回答者提到这是Java中的“bug”,并提供各种规避,例如明确调用System.gc()
等。我已经尝试了所有这些并且它们不起作用
也许有人可以添加一个新的视角,并为我慢慢思考。
答案 0 :(得分:18)
您正在尝试删除()仍由活动的,打开的FileWriter引用的文件。
试试这个:
f = new File("myFile.txt");
fw = new FileWriter(f);
fw.write("This is a sentence that should appear in the file.");
fw.flush();
fw.close(); // actually free any underlying file handles.
if(f.delete())
System.out.println("File was successfully deleted.");
else
System.err.println("File was not deleted.");
答案 1 :(得分:8)
如果没有打开文件处理程序,则只能删除该文件。由于您使用FileWriter
打开文件hanlder,因此您需要先将其关闭才能删除它。换句话说,f.delete
必须在fw.close
尝试以下代码。我进行了更改以防止您可能发现的所有错误,例如,如果fw为null。
File f = null;
FileWriter fw = null;
try {
f = new File("myFile.txt");
fw = new FileWriter(f);
fw.write("This is a sentence that should appear in the file.");
fw.flush(); // flush is not needed if this is all your code does. you data
// is automatically flushed when you close fw
} catch (Exception exc) {
System.err.println(exc.getMessage());
} finally {// finally block is always executed.
// fw may be null if an exception is raised in the construction
if (fw != null) {
fw.close();
}
// checking if f is null is unneccessary. it is never be null.
if (f.delete()) {
System.out.println("File was successfully deleted.");
} else {
System.err.println("File was not deleted.");
}
}