2013-05-12 122 views
1

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

我通过制作一个临时文件来实现这一点,然后将所有原始文件数据写入它,但没有我不想要的数据。然后,我用与原始文件相同的名称重命名该临时文件以替换它。

一切都很顺利,除了有删除原始文件和重命名临时文件的问题。

起初,我有原始文件的数据,然后在运行应用程序后,我有原始文件与相同的数据没有任何删除,临时文件命名(文件)与删除后的数据。

下面是我使用的方法:

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); 
} 
+0

什么“* temp文件不服从重命令*”实际上是指? – 2013-05-12 23:02:33

+0

意味着临时文件保留它的名称,并且原始文件保留在系统中而没有删除 – 2013-05-12 23:15:48

+0

首先我有原始文件与数据,然后运行应用程序后,我有原始文件与相同的数据没有任何删除和临时文件名称(文件)与删除后的数据 – 2013-05-12 23:18:50

回答

2

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

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

要解决这个问题,请不要创建临时文件。这不是一个真正的临时文件 - 重命名后永久存在。取而代之的是,建立在同一目录与原始文件常规文件,即

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

这将确保这两个文件是相同的文件系统上和重命名将工作。

+0

但这种方式给了我两个文件: 1- original.txt 2- original.txt.tmp – 2013-05-12 23:29:49

+0

重命名original.txt.tmp应该让它消失。问题似乎是original.txt不会被删除。 – 2013-05-12 23:32:11

+0

你是对的,我检查了原始文件,发现它甚至在删除命令后仍然存在。所以,什么可以让我确信它会被删除。 – 2013-05-12 23:37:23

1

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

+0

好,我检查了原始文件,发现它没有删除后的命令的删除,什么可以使这个问题,我能做些什么来确保删除? – 2013-05-12 23:41:31