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