假设我尝试运行此代码:
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
,您写入
的数据在实际写入文件之前会被缓冲。这意味着直到缓冲区中积累了足够的数据后才真正写入文件,从而减少写入文件的次数。因此,您需要刷新
它以“强制”它写入“A”
。您想要写下“A”。
但是“刷新”输入流/FileReader
(无论这意味着什么)是没有意义的。输入流也缓冲其数据。这意味着当您read
时,它会读取比您需要的更多的数据,并将它们放入缓冲区中,这样当您再次调用read
时,它只能从缓冲区读取,而不是从文件读取(当然,直到缓冲区耗尽)。另请参阅此question关于冲洗。
与输出流中缓冲但未写入的数据(您真正想要写入的数据)不同,您实际上并不关心输入流中缓冲但未读取的数据。这是一种定义 - 它是未读。如果您真的关心它,您就会阅读它。
这是一个关于洗衣服的类比:想象一下 ClothesReader
和 ClothesWriter
是洗衣服机器人,它们可以帮助您将脏衣服放入洗衣机中并分别返还给您。他们都有随身携带的小篮子(缓冲区)。
你可以把脏衣服放进ClothesWriter
的篮子里。但它不会立即将其放入洗衣机,因为一次只洗一件衣服通常效率很低。它会耐心等待,直到篮子装满,然后将里面的东西放入洗衣机。但是,如果您有需要立即清洗的东西怎么办?机器人上需要有一个按钮,上面写着“现在将篮子里的东西放入洗衣机”。该按钮是flush
。
洗衣机完成工作后,您可以向ClothesReader
请求干净的衣服。由于每次你要东西时去洗衣机然后再回到你那里的效率很低,每当它的篮子是空的时,它就会用洗衣机里的衣服装满它的篮子。这样,当你需要什么东西时,它就可以从篮子里拿出来给你,这比去洗衣机再回来要快得多。
你不会想要在ClothesReader
上有一个“给我你篮子里的所有东西”按钮,这(我猜?)正是FileReader.flush
会做的如果存在就做,因为它没有用。你不知道篮子里还剩下什么衣服,也不知道有多少件。
关于java - 为什么FileReader没有flush,而FileWriter有呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64618498/