使用delete()删除文件 - Java

时间:2010-09-28 03:11:45

标签: java file-io

我的代码使用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;
    }
}

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

4 个答案:

答案 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) {
        // ...
    }
}

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

  

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

没有

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

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

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

答案 1 :(得分:2)

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

您应该只需要在删除工作之前关闭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

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