怎么FileReader没有flush,FileWriter有flush呢?

How is there no flush in FileReader, but there is for FileWriter?

假设我尝试 运行 此代码:

FileWriter fw = new FileWriter("a.txt");
fw.write("A");

它不会工作,因为数据是缓冲的,并且在达到最大缓冲区大小之前不会自动刷新。所以我们用 fw.flush(); 手动刷新,之后就可以了。

然后我想从同一个文件中读取数据。我这样做并且效果很好:

FileReader fr = new FileReader ("a.txt");
System.out.println (fr.read ());
OUTPUT: 65

有人能告诉我为什么 fileReader 也没有方法 flush() 吗?我的意思是它不应该和 fileWriter 一样工作吗?在这种情况下,不是在将数据发送到源之前缓冲数据,而是在读取数据之前缓冲数据。 恐怕我遗漏了一些基本的东西,有人可以指出吗?

对于输出流/FileWriter,您write输入的数据在实际写入文件之前会被缓冲。这意味着在缓冲区中积累了足够的数据之前,它不会真正写入文件,从而减少写入文件的次数。因此你需要flush它来“强制”它写"A"。您想要 写下“A”。

但是“刷新”输入流是没有意义的/FileReader(不管那是什么意思)。输入流也缓冲其数据。这意味着当您 read 时,它会读取 比您需要的更多的数据 ,然后将它们放入缓冲区,这样当您再次调用 read 时,它就可以从缓冲区中读取,而不是从文件中读取(当然,直到缓冲区用完)。另请参阅此 关于冲洗的内容。

与输出流中的 buffered-but-unwritten 数据(您真正想要写入的数据)不同,您 实际上并不关心 中的 buffered-but-unread 数据输入流。这有点像定义 - 未读。如果你真的关心它,你就会读它。


这里有一个关于洗衣服的类比:假设 ClothesReaderClothesWriter 是 clothes-washing 机器人,它们分别帮助您将脏衣服放入洗衣机中并还给您。他们都有随身携带的小篮子(缓冲液)。

你可以把脏衣服放进ClothesWriter的篮子里。不过,它不会立即将它带到洗衣机,因为一次只洗一件衣服通常效率很低。它会耐心等待,直到篮子装满,然后将里面的东西放入洗衣机。但是,如果您有需要立即清洗的东西怎么办?机器人上需要有一个按钮,上面写着“将篮子里的东西放入洗衣机现在”。那个按钮是 flush.

洗衣机完成工作后,您可以向ClothesReader索要干净的衣服。由于每次你需要东西时去洗衣机然后再返回给你是低效的,只要它的篮子是空的,它就会用洗衣机里的衣服装满它的篮子。这样,当你要东西的时候,它可以直接从篮子里拿出来给你,比去洗衣机再回来快多了。

你不会想要 ClothesReader 上的“把你购物篮里的所有东西都给我”按钮,如果 FileReader.flush 存在的话,(我猜?)这就是它会做的事情,因为它不会有用。你不知道它的篮子里还剩下什么衣服,也不知道有多少。