为什么FileReader没有flush,而FileWriter有呢?

Ste*_*fan 2 java io buffer filereader filewriter

假设我尝试运行这段代码:

FileWriter fw = new FileWriter("a.txt");
fw.write("A");
Run Code Online (Sandbox Code Playgroud)

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

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

FileReader fr = new FileReader ("a.txt");
System.out.println (fr.read ());
OUTPUT: 65
Run Code Online (Sandbox Code Playgroud)

有人能告诉我为什么没有方法flush()fileReader?我的意思是它不应该起到相反的作用吗fileWriter?在这种情况下,数据将在读取之前进行缓冲,而不是在发送到源之前缓冲数据。我担心我错过了一些基本的东西,有人可以指出吗?

Swe*_*per 5

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

但“刷新”输入流/ FileReader(无论这意味着什么)是没有意义的。输入流也缓冲其数据。这意味着当您read读取超过您需要的数据时,它会将它们放入缓冲区中,这样当您read再次调用时,它可以从缓冲区中读取,而不是从文件中读取(当然,直到缓冲区耗尽) 。另请参阅有关冲洗的问题

与输出流中已缓冲但未写入的数据(您真正想要写入的数据)不同,您实际上并不关心输入流中已缓冲但未读取的数据。这就是定义上的——它是未读的。如果你真的关心它,你就会读它。


打个关于洗衣服的比喻:想象一下,ClothesReaderClothesWriter是洗衣机器人,可以帮助你把脏衣服放进去洗,然后分别还给你。他们都有随身携带的小篮子(缓冲区)。

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

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

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