繁体   English   中英

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

[英]PrintWriter: reading and writing to the same file - file appears not to be saved before being opened again

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

主程序连续三次调用保护程序,每个插槽一次。 这应该导致保存文件看起来如下(其中#是分隔符):

在第一次通话之前:#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 saver = new PrintWriter(new FileWriter(fileName)))在保护程序文件中打开,而不是在主文件中打开,因此每次调用都会打开一个新的PrintWriter。 我在保护程序方法结束时使用.flush()和.close()(这是一个void方法)。

为什么在下一次调用方法之前,文件似乎没有被保存? = S我是否必须施加某种wait-until-file-not-open-anymore命令,这样,我该怎么做?

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 除非您从文件系统的根目录( / )运行程序,否则它们不是相同的文件。

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

另外,在finally块中关闭reader和writer,或者使用Java 7 try-with-resources构造。

这正是你告诉它的。 每次调用saveState时,都会将新实例化数组的单个索引设置为“newString”,并显示该数组。

编辑

对不起,我误读了你的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM