【问题标题】:PrintWriter: reading and writing to the same file - file appears not to be saved before being opened againPrintWriter:读取和写入同一个文件 - 文件在再次打开之前似乎没有保存
【发布时间】:2012-12-25 17:20:45
【问题描述】:

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

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

第一次通话前:#EMPTY#EMPTY#EMPTY

第一次调用后:#NewString#EMPTY#EMPTY

第二次通话后:#NewString#NewString#EMPTY

第三次调用后:#NewString#NewString#NewString

.

取而代之的是:

第一次通话前:#EMPTY#EMPTY#EMPTY

第一次调用后:#NewString#EMPTY#EMPTY

第二次通话后:#EMPTY#NewString#EMPTY

第三次调用后:#EMPTY#EMPTY#NewString

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

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

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

【问题讨论】:

    标签: java filewriter printwriter


    【解决方案1】:

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

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

    另外,在 finally 块中关闭读取器和写入器,或使用 Java 7 try-with-resources 构造。

    【讨论】:

    • 我刚刚在我的系统上运行了这段代码,将文件路径更改为相同的东西,它运行正常。干得好,JB。
    • 谢谢...这是一个愚蠢的错误,现在我感到很尴尬。 =)
    【解决方案2】:

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

    编辑

    对不起,我看错了你的代码。

    【讨论】:

    • 新实例化的数组首先填充文件的内容,正如问题所解释的那样,正如代码所示。所以那里没有错误。错误在文件名中。阅读我的答案。
    猜你喜欢
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多