java - 写入文件时的奇怪行为

标签 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 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 写入文件中的.

因为两个BufferedWriterPrintWriter写入同一个文件,由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/

相关文章:

java - 为什么我无法在 Windows 上使用 Java 从下载的源正确写入 PNG 文件?

c - 如何以相同的模式和标志打开 fdopen?

io - 如何判断是否使用了 O_DIRECT?

Haskell - 阅读人员名单

java - 导出特定 java 版本的可部署功能

java - 使用 Java 的 Kinect v2

java - Java中将二进制文件读入ArrayList

string - 即使文件存在,为什么 String(contentsOfFile) 也会失败?

io - 在 J 中读取多行标准输入

java - Android与PC之间的双向通信