Java 更新数据列表时出现问题

Java 更新数据列表时出现问题,java,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"); Buffe

调用函数:

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();
        }
    }
在我运行程序之前,文件
proxies.txt
中有数据。然而,当我运行程序时,它似乎被清除了。它变空了

我注意到,当程序运行时,如果我将鼠标移到文件
proxies.txt
,Windows将显示
“修改日期”
,它显示的时间是当前时间,或者上次执行函数
deleteProxy(…)

有人知道我做错了什么吗?为什么列表不更新而看起来是空的呢

更新代码:

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,但无法生成新文件:\
也许我应该找到一种新方法来更新文本文件,您有什么建议吗?

您的重命名操作可能不起作用,如下所示:

此方法行为的许多方面本质上依赖于平台:重命名操作可能无法将文件从一个文件系统移动到另一个文件系统,它可能不是原子的,并且如果具有目标抽象路径名的文件已存在,则可能无法成功。应始终检查返回值,以确保重命名操作成功

因此,基本上,您正在擦除旧文件,并且不能保证新文件将取代它。您必须检查
File.rename()的返回值

至于为什么您的代码> Reimoto 可能会失败:您没有关闭从旧文件中读取的嵌套的流集,因此操作系统可能仍会考虑抽象路径名存在。尝试确保关闭所有打开的嵌套流。

尝试以下操作:

if(proxyNew.renameTo(proxyOld)){
    throw new Exception("Could not rename proxyNew to proxyOld");
}

那是一个,不是一个。不:然后他把新的改名为旧的。我在一个小的主测试中测试了这个,它如预期的那样工作-即使在删除了“new”@Bohemian之后,“old”也变成了“new”文件,问题基本上是删除旧文件并尝试重命名新文件的链接操作;但是旧文件仍然有一个有效的抽象路径,所以它并没有真正消失,而新的重命名几乎肯定会失败。我同意你应该检查一下+0代表彻底性。嗯。。添加返回值表示它不工作。我想知道哪些流没有被关闭,我打开的所有流似乎都被关闭了:|@Kyle:你打开了一个
FileInputStream
InputStreamReader
和一个
BufferedReader
,但我相信你只关闭了
BufferedReader
if(proxyNew.renameTo(proxyOld)){
    throw new Exception("Could not rename proxyNew to proxyOld");
}
FileInputStream in = new FileInputStream(proxyOld);
BufferedReader fileStream = new BufferedReader(new InputStreamReader(in));

...

in.close();