更新数据列表时出现问题

时间:2011-07-12 03:31:47

标签: java

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就好了,但无法生成新文件:\ 也许我应该找一个更新文本文件的新方法,你有什么建议吗?

2 个答案:

答案 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();