Java PrintWriter:读取和写入同一个文件-文件在再次打开之前似乎不会保存

Java PrintWriter:读取和写入同一个文件-文件在再次打开之前似乎不会保存,java,filewriter,printwriter,Java,Filewriter,Printwriter,我正在尝试创建一个程序,将新数据写入保存文件。该文件有三个“插槽”,即三个由分隔符分隔的字符串。主程序以插槽作为参数调用saver程序,saver程序打开文件,将每个插槽中的现有字符串读取为局部变量,用新字符串替换与给定插槽对应的字符串,并用新插槽覆盖文件。这将导致只更新给定的插槽,而其他两个插槽保持与以前相同 主程序连续三次调用saver,每个插槽调用一次。这将导致保存文件如下所示(其中#是分隔符): 第一次呼叫前:#EMPTY#EMPTY#EMPTY 第一次呼叫后:#NewString#EM

我正在尝试创建一个程序,将新数据写入保存文件。该文件有三个“插槽”,即三个由分隔符分隔的字符串。主程序以插槽作为参数调用saver程序,saver程序打开文件,将每个插槽中的现有字符串读取为局部变量,用新字符串替换与给定插槽对应的字符串,并用新插槽覆盖文件。这将导致只更新给定的插槽,而其他两个插槽保持与以前相同

主程序连续三次调用saver,每个插槽调用一次。这将导致保存文件如下所示(其中#是分隔符):

第一次呼叫前:#EMPTY#EMPTY#EMPTY

第一次呼叫后:#NewString#EMPTY#EMPTY

第二次呼叫后:#新闻字符串#新闻字符串#空

第三次呼叫后:#新闻字符串#新闻字符串#新闻字符串

相反,发生的是:

第一次呼叫前:#EMPTY#EMPTY#EMPTY

第一次呼叫后:#NewString#EMPTY#EMPTY

第二次呼叫后:#EMPTY#NewString#EMPTY

第三次呼叫后:#EMPTY#EMPTY#NewString

printwriter(printwriter saver=new printwriter(new FileWriter(fileName)))在保存文件中打开,而不是在主文件中打开,因此每次调用都会打开一个新的printwriter。saver方法末尾的I.flush()和.close()(这是一个void方法)

为什么在下一次调用该方法之前,文件似乎没有保存=我必须强制执行某种类型的等待,直到文件不再打开的命令,那么,我该怎么做呢

public static void main(String[] args) throws IOException {

        SaveGame.saveState("adventure/save/s1.save", new Adventure(), 0);

        SaveGame.saveState("adventure/save/s2.save", new Adventure(), 1);

        SaveGame.saveState("adventure/save/s3.save", new Adventure(), 2);
        }
然后:

public class SaveGame {

public static void saveState(String fileName, Adventure a, int slot) throws IOException {   

    //UPDATE MASTER SAVE FILE save.txt
    String[] save = new String[3]; 

    try {
        Scanner openSave = new Scanner(new FileReader("/adventure/save/save.txt"));
        openSave.useDelimiter("#");
        save[0] = openSave.next();
        save[1] = openSave.next();
        save[2] = openSave.next();
        openSave.close();
    }
    catch (FileNotFoundException e) {
        save[0] = "EMPTY";
        save[1] = "EMPTY";
        save[2] = "EMPTY";
    }

    save[slot] = "newString"; //change the CURRENT save in the given slot to the new

    PrintWriter updater = new PrintWriter(new FileWriter("adventure/save/save.txt"));
    updater.println("#" + save[0] + "#" + save[1] + "#" + save[2]);
    updater.flush();
    updater.close();

读卡器读取文件
/adventure/save/save.txt
,而写卡器写入
adventure/save/save.txt
。除非从文件系统的根目录(
/
)运行程序,否则这些文件不是相同的文件

应用干燥原则(不要重复)。创建一个包含文件路径的常量,并在使用该路径的任何地方使用该常量。这将避免此类错误


另外,在finally块中关闭读写器,或者使用Java7try-with-resources结构。

它完全按照您的指示执行。每次调用saveState时,都将新实例化数组的单个索引设置为“newString”,并显示该数组

编辑


抱歉,我误读了您的代码。

我刚刚在系统上运行了此代码,将文件路径更改为相同的路径,并且运行正常。干得好,JB。谢谢。。。犯了这么愚蠢的错误,现在我感到很尴尬新实例化的数组首先填充文件的内容,如问题所述,如代码所示。所以那里没有虫子。错误在文件名中。读我的答案。