我的系统中存储了一个文件,我想从中删除某些数据。
我通过制作一个临时文件来完成此任务,然后将所有原始文件数据写入该文件,但没有不需要的数据。然后,我用与原始文件相同的名称重命名该临时文件以替换它。
一切进行得很好,除了删除原始文件和重命名临时文件存在问题。
首先,我拥有包含数据的原始文件,然后运行该应用程序后,我拥有具有相同数据的原始文件,没有任何删除,而名为临时(文件)的临时文件具有删除后的数据。
这是我使用的方法:
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);
}
最佳答案
您可能要检查delete()
的返回值。如果旧文件没有被删除,则将阻止重命名新文件。如果旧文件可能仍被其他服务打开,或者您没有正确的权限,则可以在删除之前尝试将其重命名为path + ".old"
。即使无法删除它,也可能会将其移开。您也可以尝试file.setWriteable(true)
。这实际上取决于为什么无法删除该文件。
另外,根据您的系统设置,临时文件可能创建在需要移动而不是重命名的位置(即,它不在同一文件系统上),因此renameTo()
不起作用。
要解决此问题,请不要创建临时文件。这实际上不是临时文件,而是重命名后的永久文件。而是在与原始文件相同的目录中创建一个常规文件,即
File temp = new File(path + ".tmp");
这样可以确保两个文件都在同一个文件系统上,并且可以重命名。