我的代码使用BufferedReader
从文件[main.txt]和PrintWriter
读取以写入另一个temp [main.temp]文件。我关闭了两个流,但我无法在与[main.txt]关联的delete()
对象上调用File
方法。关闭两个流后,只有在调用System.gc()
后才能删除File
对象。
public static boolean delete (String str1, String str2, File FileLoc)
{
File tempFile = null;
BufferedReader Reader = null;
PrintWriter Writer = null;
try
{
tempFile = new File (FileLoc.getAbsolutePath() + ".tmp");
Reader = new BufferedReader(new FileReader(FileLoc));
Writer = new PrintWriter(new FileWriter(tempFile));
String lsCurrLine = null;
while((lsCurrLine = Reader.readLine()) != null)
{
// ...
// ...
if (true)
{
Writer.println(lsCurrLine);
Writer.flush();
}
}
Reader.close();
Writer.close();
System.gc();
}
catch(FileNotFoundException loFileExp)
{
System.out.println("\n File not found . Exiting");
return false;
}
catch(IOException loFileExp)
{
System.out.println("\n IO Exception while deleting the record. Exiting");
return false;
}
}
这可靠吗?或者有更好的解决方案吗?
答案 0 :(得分:3)
@ user183717 - 您发布的代码显然不是所有相关代码。例如,那些“......”以及在该代码中实际上没有调用File.delete()
的事实。
当流对象被垃圾回收时,其终结器会关闭底层文件描述符。因此,删除仅在您添加System.gc()
调用时才有效,这有力证明您的代码以某种方式无法关闭文件的某些流。它可能是与您发布的代码中打开的流对象不同的流对象。
正确编写的流处理代码使用finally
块来确保流无论如何都会被关闭。例如:
Reader reader = new BufferedReader(new FileReader(file));
try {
// do stuff
} finally {
try {
reader.close();
} catch (IOException ex) {
// ...
}
}
如果您不遵循该模式或类似的模式,则很可能存在流不总是关闭的情况。例如,在您的代码中,如果其中一个read
或write
调用引发异常,您将跳过关闭流的语句。
这是[即]调用
System.gc();
]可靠吗?
没有
gc()
调用。System.gc()
会注意到流无法访问。假设流对象可能是终结的,而调用System.gc()
可能只会收集伊甸园空间。或者有更好的解决方法吗?
是。修复您的应用程序以正确关闭其流。
答案 1 :(得分:2)
当您说“关闭两个流”时,您的意思是BufferedReader
和PrintWriter
?
您应该只需要在删除工作之前关闭BufferedReader
,但您还需要关闭基础流;通常调用BufferedReader.close()
会这样做。听起来你想你正在关闭流,但实际上你并没有成功。
您的代码存在一个问题:如果发生异常,您不会关闭流。通常最好在finally
块中关闭流。
此外,您发布的代码在任何地方都没有使用File.delete()
? ...
行究竟做了什么 - 他们是否有机会将Reader
重新分配给新流?
答案 2 :(得分:1)
尝试使用java.io.File库。这里是简单的样本:
File f = new File("file path or file name");
f.delete();
答案 3 :(得分:0)
尝试使用apache commons io