我正在尝试一些基本的 Java I/O 操作,我尝试运行以下代码:
public static void main(String[] args) {
File file = new File("fileWrite2.txt"); // create a File object
try {
FileWriter fr = new FileWriter(file);
PrintWriter pw = new PrintWriter(file); // create a PrintWriter that will send its output to a Writer
BufferedWriter br = new BufferedWriter(fr);
br.write("sdsadasdsa");br.flush();br.append("fffff");br.flush();
pw.println("howdy"); // write the data
pw.println("folks");
pw.flush();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
当我运行上面的命令时,我在创建的文件中得到以下输出:
howdy
folks
f
谁能解释为什么“f”出现在最后一行?
最佳答案
f
来自 br.append("fffff");
的左边字符串这是由 BufferedWriter
写入文件中的.
因为两个BufferedWriter
和 PrintWriter
写入同一个文件,由PrintWriter
写入的内容覆盖由 BufferedWriter
写入的内容.
但似乎没有。 PrintWriter
写入的字节数差 1 以完全覆盖 BufferedWriter
写入的数据这样你就得到了 f
.
如果你改变这个br.append("fffff");
至 br.append("ffffg");
, 你可以看到 g
现在剩下了。或者,更改 pw.println("folks");
至 pw.println("folks1");
将显示先前写入的数据现在已被 PrintWriter
完全覆盖.
所有这些混淆是因为同一个文件对象有 2 个不同的编写器,这是问题的原因。作为@Boris指出,一个文件对象只有 1 个编写器。
注意:要测试的另一个有趣的事情是移动第二个 br.flush();
在pw.flush();
之后.
// br.flush(); // moved from here
pw.println("howdy"); // write the data
pw.println("folks");
pw.flush();
br.flush(); // to here
关于java - 写入文件时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19971665/