gpt4 book ai didi

java - 使用delete()删除文件 - Java

转载 作者:行者123 更新时间:2023-12-01 16:40:41 25 4
gpt4 key购买 nike

我的代码使用 BufferedReader 从文件 [main.txt] 读取数据,并使用 PrintWriter 写入另一个临时 [main.temp] 文件。我关闭了两个流,但无法在与 [main.txt] 关联的 File 对象上调用 delete() 方法。只有在关闭两个流后调用 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;
}
}

这可靠吗?或者有更好的解决办法吗?

最佳答案

@user183717 - 您发布的代码显然不是所有相关代码。例如,那些“...”以及该代码中实际上并未调用 File.delete() 的事实。

当流对象被垃圾收集时,其终结器将关闭底层文件描述符。因此,只有在添加 System.gc() 调用时删除才有效,这一事实有力地证明了您的代码不知何故未能关闭文件的某些流。它很可能是与您发布的代码中打开的流对象不同的流对象。

正确编写的流处理代码使用finally block 来确保流无论如何都会关闭。例如:

Reader reader = new BufferedReader(new FileReader(file));
try {
// do stuff
} finally {
try {
reader.close();
} catch (IOException ex) {
// ...
}
}

如果您不遵循该模式或类似的模式,则很可能存在流并不总是关闭的情况。例如,在您的代码中,如果 readwrite 调用之一引发异常,您将跳过关闭流的语句。

Is this [i.e. calling System.gc();] reliable?

没有。

  1. JVM 可能会配置为忽略应用程序的 gc() 调用。
  2. 目前还不能保证丢失的流将无法访问。
  3. 无法保证调用 System.gc() 会注意到流无法访问。假设,流对象可能会被保留,并且调用 System.gc() 可能只会收集 Eden 空间。
  4. 即使 GC 发现流无法访问,也不能保证 GC 会立即运行终结器。假设,运行终结器可以被推迟......无限期。

Or is there a better fix ?

是的。修复您的应用程序以正确关闭其流。

关于java - 使用delete()删除文件 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3809418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com