PrintWriter 未按正确顺序附加内容

PrintWriter not appending content in the right order

我有一个包含对象的列表(其构造函数包含另一个内部对象)。当我尝试将列表打印到文件时,我遍历每个对象并调用对象各自的编写器方法。

public void writer(String file, boolean append) {
    File path = new File("../Opdracht6_2/src/" + file);
    try {
        PrintWriter write = new PrintWriter(new FileOutputStream(path,
                append));
        for (SuperObject o : this.list) {
            if (o instanceof Object1) {
                ((subObject1) w).writer1(file);
            }
            if (o instanceof Object2) {
                ((subObject3) w).writer2(file);
                
            }if (o instanceof Object3) {
                ((subObject3) w).writer3(file);
                
            }
        }
        write.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

在对象的 writer 方法中,我尝试首先打印一行说明它是什么类型,然后调用 innerobject 的 writer 方法。之后,我希望打印当前对象的参数,然后返回到列表编写器方法

public void writer1(String file) {
    File path = new File("../Opdracht6_2/src/" + file);
    try {
        PrintWriter write = new PrintWriter(
                new FileOutputStream(path, true));
        //below is the string I want to print before the innerobject appends 
        //its own arguments to the file
        write.append("String\r\n");
        this.innerobject.innerwriter();
        write.append(this objects arg);
        write.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

innerobject 的作者

public void innerwriter(String file) {
    File path = new File("../Opdracht6_2/src/" + file);
    try {
        PrintWriter write = new PrintWriter(
                new FileOutputStream(path, true));
        write.append(this objects arg);
        write.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

现在实际发生的事情是,我首先尝试附加的行被附加到内部对象的参数之后,即使我已经将它放在调用内部对象的编写器的方法之前。 然后在文件中看起来像这样:

inner objects arg

string

outer objects arg

有人可以解释为什么吗?

这里的每个方法最好不要使用Writer。使用单个 StringBuilder 附加内容并将其传递给方法。可能是 Writer 没有按照附加内容的顺序正确刷新内容。具体来说,innerwriter 中的语句 write.close() 会在 "String\r\n" 实际由调用方方法中的 Writer 写入之前刷新内部对象的内容。

您可以避免创建多个 Writer,而是使用 StringBuilder

// pass a StringBuilder to append
public void innerwriter(StringBuilder sb) {
    sb.append(this objects arg);
}

并且当您完成附加所有内容后,使用仅创建一次的 Writer 编写它:

PrintWriter write = new PrintWriter(new FileOutputStream(path,
            append));
StringBuilder sb = new StringBuilder();
for (SuperObject o : this.list) {
    if (o instanceof Object1) {
        ((subObject1) w).writer1(sb);
    }
    if (o instanceof Object2) {
        ((subObject3) w).writer2(sb);

    } if (o instanceof Object3) {
        ((subObject3) w).writer3(sb);

    }
}

write.append(sb.toString());
write.close();