写入文件时的奇怪行为

时间:2013-11-14 07:10:49

标签: 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”会出现在最后一行吗?

3 个答案:

答案 0 :(得分:7)

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指出的那样,只有一个文件对象的编写器。

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

// br.flush(); // moved from here
pw.println("howdy"); // write the data
pw.println("folks");
pw.flush();
br.flush(); // to here

答案 1 :(得分:3)

通过执行此操作,您在bufferedwriter上写了15个字符 `

br.write("sdsadasdsa");
br.flush();
br.append("fffff");`

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

pw.println("howdy"); // write the data
pw.println("folks");

这是10个字符,只有两个新行\n,由于我们使用println需要2个字节,因为Windows中的\n将转换为\r\n。总共14个。 所以剩下1个字符就是f

答案 2 :(得分:2)

在您的代码中执行以下步骤。

1

br.write("sdsadasdsa");br.flush();br.append("fffff");br.flush();

已执行。

文件内容为

sdsadasdsafffff

2时      pw.println( “你好”);正在打电话。

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

howdy

dsafffff

3时     pw.println( “人”); 被执行。

因为它在步骤#2中没有被称为flush()方法。 String folks 将覆盖文件中的第二行内容。还有一个新的行来写另外2个字符。

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

howdy

folks

f