FileReader中没有刷新,但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

有人可以告诉我为什么对flush()也没有方法fileReader吗?我的意思是说它不应该和fileWriter一样工作吗?在这种情况下,与其在将数据发送到源之前先缓冲数据,不如在读取数据之前先对数据进行缓冲。 恐怕我缺少一些基本知识,有人可以指出吗?

解决方法

对于输出流/ FileWriter,在实际写入文件之前,将对write的数据进行缓冲。这意味着,直到在缓冲区中累积了足够的数据之后,它才真正写入文件,以减少对文件的写入次数。因此,您需要flush对其进行“强制”写入"A"。您想要要写的“ A”。

但是“刷新”输入流/ FileReader(这意味着什么)是没有意义的。输入流也缓冲其数据。这意味着,当您read读取的数据比所需的多 时,将它们放入缓冲区,以便再次调用read时,它可以从缓冲区,而不是文件(当然,直到缓冲区用完为止)。另请参阅此question有关冲洗的信息。

与输出流中的缓冲但未写入的数据(您确实要写入)不同,您实际上并不关心输入流中的缓冲但未读取的数据。顾名思义,这是未读。如果您真的很在意它,那么您应该已经读过。


这里有一个类似于洗衣服的例子:想象ClothesReaderClothesWriter是洗衣服的机器人,它们可以帮助您将脏衣服洗净并分别归还给您。他们俩都有随身携带的小篮子(缓冲器)。

您可以将脏衣服放到ClothesWriter的篮子里。不过,它不会立即送入洗衣机,因为一次只能洗一件衣服通常效率低下。它将耐心等待,直到篮子装满,然后然后将其内容放入洗衣机。但是,如果您有需要立即洗的东西怎么办?机器人上必须有一个按钮,上面写着“将篮子中的东西放入洗衣机 now ”。该按钮为flush

洗衣机完成工作后,您可以向ClothesReader要求穿干净衣服。由于去洗衣机的效率很低,因此每次您请求东西时都会回覆您,每当它的篮子空了时,它就会用洗衣机里的衣服装满篮子。这样,当您需要一些东西时,它可以将其从篮子中取出并交给您,与去洗衣机和回去相比,这是非常快的。

您不希望在ClothesReader上“把篮子里的所有东西给我”按钮,({我猜想?)FileReader.flush会做,因为它会存在没有用。您不知道篮子里还剩多少衣服。