使用delete()删除文件 – Java

我的代码使用BufferedReader从文件[main.txt]和PrintWriter读取以写入另一个temp [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()调用时才有效,这有力certificate您的代码无法以某种方式关闭文件的某些流。 它可能是与您发布的代码中打开的流对象不同的流对象。

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

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

如果您不遵循该模式或类似的模式,那么很可能存在流不总是被关闭的情况。 例如,在您的代码中,如果其中一个readwrite调用引发了exception,您将跳过关闭流的语句。

这是[即调用System.gc(); ]可靠吗?

没有。

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

或者有更好的解决方案吗?

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

当你说“关闭两个流”时,你的意思是BufferedReaderPrintWriter

您应该只需要在删除工作之前关闭BufferedReader ,但您还需要关闭基础流; 通常调用BufferedReader.close()会这样做。 听起来你认为你正在关闭流,但你实际上并没有成功。

代码的一个问题:如果发生exception,则不会关闭流。 通常最好关闭finally块中的流。

此外,您发布的代码不在任何地方使用File.delete() ? 那些...线路究竟做了什么 – 他们是否会重新将Reader重新分配给新流?

尝试使用java.io.File库。 这里简单的样本:

 File f = new File("file path or file name"); f.delete(); 

尝试使用apache commons io

http://commons.apache.org/io/description.html