private static void deleteProxy(File proxyOld, String host, int port) {
try {
String lines, tempAdd;
boolean removeLine = false;
File proxyNew = new File("proxies_" + "cleaner$tmp");
BufferedReader fileStream = new BufferedReader(new InputStreamReader(new FileInputStream(proxyOld)));
BufferedWriter replace = new BufferedWriter(new FileWriter(proxyNew));
while ((lines = fileStream.readLine()) != null) {
tempAdd = lines.trim();
if (lines.trim().equals(host + ":" + port)) {
removeLine = true;
}
if (!removeLine) {
replace.write(tempAdd);
replace.newLine();
}
}
fileStream.close();
replace.close();
proxyOld.delete();
proxyNew.renameTo(proxyOld);
} catch (Exception e) {
e.printStackTrace();
}
}
调用该函数:
File x = new File("proxies.txt");//is calling a new file the reason why it's being flushed out?
deleteProxy(x, host, port);
在运行程序之前,文件proxies.txt
内部有数据。但是,当我运行该程序时,它似乎被刷新了。它变空了。
我注意到程序运行时,如果我将鼠标移到文件proxies.txt
上,Windows会显示"Date Modified"
,它显示的时间是当前时间,或上次是函数{{ 1}}被执行了。
有谁知道我做错了什么?为什么列表不会更新而不是显示为空?
更新的代码:
deleteProxy(...)
运行更新后的代码,删除proxies.txt就好了,但无法生成新文件:\ 也许我应该找一个更新文本文件的新方法,你有什么建议吗?
答案 0 :(得分:1)
根据File.renameTo()
documentation:
此方法行为的许多方面本质上都依赖于平台:重命名操作可能无法将文件从一个文件系统移动到另一个文件系统,它可能不是原子的,并且如果文件具有目标抽象路径名已存在。应始终检查返回值以确保重命名操作成功。
所以基本上,你正在擦除你的旧文件,而且你无法保证新文件将取而代之。您必须检查File.renameTo()
的返回值:
if(proxyNew.renameTo(proxyOld)){
throw new Exception("Could not rename proxyNew to proxyOld");
}
至于您的renameTo
可能失败的原因:您没有关闭您打开以从旧文件中读取的嵌套流集,因此操作系统仍可能认为存在抽象路径名。尝试确保关闭所有打开的嵌套流。
答案 1 :(得分:1)
试试这个:
FileInputStream in = new FileInputStream(proxyOld);
BufferedReader fileStream = new BufferedReader(new InputStreamReader(in));
...
in.close();