从文件中删除某些数据

时间:2013-05-12 22:54:41

标签: java file file-io

我的系统中存有一个文件,我想从中删除某些数据。

我通过创建一个临时文件来完成此操作,然后将所有原始文件数据写入其中,但没有我不想要的数据。然后,我将该临时文件重命名为原始文件的相同名称,以便替换它。

除非删除原始文件并重命名临时文件,否则一切顺利。

首先,我有原始文件包含数据,然后在运行应用程序后,我使用相同数据的原始文件没有任何删除,以及删除后带有数据的临时文件(文件)。

这是我正在使用的方法:

public void remove(String path, String link, String ext) throws IOException {

    File file = new File(path);
    File temp = File.createTempFile("file", ext, file.getParentFile());
    String charset = "UTF-8";
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), charset));
    PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(temp), charset));

    for (String line; (line = reader.readLine()) != null; ) {
        line = line.replace(link, "");
        writer.println(line);
    }

    reader.close();
    writer.close();
    file.delete();
    temp.renameTo(file);
}

2 个答案:

答案 0 :(得分:2)

您可能想要检查delete()的返回值。如果旧文件未被删除,则会阻止重命名新文件。如果旧文件可能仍由其他服务开放,或者您没有权限,则可以尝试将其重命名为path + ".old",然后再将其删除。这可能会将其移除,即使它不能被删除。您也可以尝试file.setWriteable(true)。这实际上取决于文件无法删除的原因。

此外,根据您的系统设置,可能会在需要移动而不是重命名的位置创建临时文件(即它不在同一文件系统上),因此renameTo()不会&#39工作。

要解决此问题,请不要创建临时文件。这不是真正的临时文件 - 它在重命名后是永久性的。而是在与原始文件相同的目录中创建常规文件,即

File temp = new File(path + ".tmp");

这将确保两个文件位于同一文件系统上,并且重命名将起作用。

答案 1 :(得分:1)

它可能不起作用,因为有一个服务仍然挂在那些文件上; renameTo方法不可靠。尝试测试该方法产生的布尔值,看看会发生什么。在释放与文件关联的锁之前,您可能需要休眠。