问题描述
说我尝试运行此代码:
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有关冲洗的信息。
与输出流中的缓冲但未写入的数据(您确实要写入)不同,您实际上并不关心输入流中的缓冲但未读取的数据。顾名思义,这是未读。如果您真的很在意它,那么您应该已经读过。
这里有一个类似于洗衣服的例子:想象ClothesReader
和ClothesWriter
是洗衣服的机器人,它们可以帮助您将脏衣服洗净并分别归还给您。他们俩都有随身携带的小篮子(缓冲器)。
您可以将脏衣服放到ClothesWriter
的篮子里。不过,它不会立即送入洗衣机,因为一次只能洗一件衣服通常效率低下。它将耐心等待,直到篮子装满,然后然后将其内容放入洗衣机。但是,如果您有需要立即洗的东西怎么办?机器人上必须有一个按钮,上面写着“将篮子中的东西放入洗衣机 now ”。该按钮为flush
。
洗衣机完成工作后,您可以向ClothesReader
要求穿干净衣服。由于去洗衣机的效率很低,因此每次您请求东西时都会回覆您,每当它的篮子空了时,它就会用洗衣机里的衣服装满篮子。这样,当您需要一些东西时,它可以将其从篮子中取出并交给您,与去洗衣机和回去相比,这是非常快的。
您不希望在ClothesReader
上“把篮子里的所有东西给我”按钮,({我猜想?)FileReader.flush
会做,因为它会存在没有用。您不知道篮子里还剩多少衣服。