我的系统中存有一个文件,我想从中删除某些数据。
我通过创建一个临时文件来完成此操作,然后将所有原始文件数据写入其中,但没有我不想要的数据。然后,我将该临时文件重命名为原始文件的相同名称,以便替换它。
除非删除原始文件并重命名临时文件,否则一切顺利。
首先,我有原始文件包含数据,然后在运行应用程序后,我使用相同数据的原始文件没有任何删除,以及删除后带有数据的临时文件(文件)。
这是我正在使用的方法:
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 :(得分:2)
您可能想要检查delete()
的返回值。如果旧文件未被删除,则会阻止重命名新文件。如果旧文件可能仍由其他服务开放,或者您没有权限,则可以尝试将其重命名为path + ".old"
,然后再将其删除。这可能会将其移除,即使它不能被删除。您也可以尝试file.setWriteable(true)
。这实际上取决于文件无法删除的原因。
此外,根据您的系统设置,可能会在需要移动而不是重命名的位置创建临时文件(即它不在同一文件系统上),因此renameTo()
不会&#39工作。
要解决此问题,请不要创建临时文件。这不是真正的临时文件 - 它在重命名后是永久性的。而是在与原始文件相同的目录中创建常规文件,即
File temp = new File(path + ".tmp");
这将确保两个文件位于同一文件系统上,并且重命名将起作用。
答案 1 :(得分:1)
它可能不起作用,因为有一个服务仍然挂在那些文件上; renameTo方法不可靠。尝试测试该方法产生的布尔值,看看会发生什么。在释放与文件关联的锁之前,您可能需要休眠。