Java 写入文件时的奇怪行为

Java 写入文件时的奇怪行为,java,file-io,io,printwriter,bufferedwriter,Java,File Io,Io,Printwriter,Bufferedwriter,我尝试了一些基本的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

我尝试了一些基本的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
写入文件的code>

由于
BufferedWriter
PrintWriter
都写入同一个文件,因此
PrintWriter
写入的内容将覆盖
BufferedWriter
写入的内容

但是,
PrintWriter
写入的字节数似乎少于1,从而完全覆盖了
BufferedWriter
写入的数据,因此得到了
f

如果您更改此
br.append(“fffff”)添加到
br.append(“ffffg”),您可以看到
g
现在剩余。或者,更改
pw.println(“乡亲”)
pw.println(“folks1”)将显示以前写入的数据现在已被
PrintWriter
完全覆盖

所有这些混乱都是因为同一文件对象有两个不同的写入程序,这是问题的原因。如前所述,一个文件对象只有一个writer

注意:要测试的另一件有趣的事情是移动第二个
br.flush()
pw.flush()之后


执行此操作将在
bufferedwriter
上写入15个字符 `

但当您在printWriter上写入时,它会覆盖文件的内容 这次你在写作

pw.println("howdy"); // write the data
pw.println("folks");
因为windows中的
\n
将转换为
\r\n
,所以使用println后,它只包含10个字符和两个新行
\n
,需要2个字节。总共14个。
因此,代码中保留了1个字符,即f

,执行以下步骤

1何时

br.write("sdsadasdsa");br.flush();br.append("fffff");br.flush();
被执行

文件内容将被删除

sdsadasdsafffff
2何时 pw.println(“你好”);我在打电话

字符串howdy覆盖前5个字符sdsad,新行终止该行。在txt中,需要2个字符\r\n,这将覆盖另2个字符。然后文件内容将如下所示:

howdy

dsafffff
3何时 普华永道(“乡亲”); 被执行

因为在第2步中没有调用flush()方法。字符串将覆盖文件中的第二行内容。和一个新的行来覆盖另外2个字符

然后,以下内容将存储在文件中:

howdy

folks

f

简而言之,每个文件只能使用一个
编写器
。谢谢。更新了答案,提到了这一点!:)@R.J-尝试了你的建议,移动了第二个br.flush();在pw.flush()之后;。现在输出变为:howdy Folffff有人能解释一下吗?写入程序是否只在我们刷新()流之后才写入文件?
howdy

dsafffff
howdy

folks

f