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

标签 java io buffer 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

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

最佳答案

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

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

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


这是一个关于洗衣服的类比:想象一下 ClothesReaderClothesWriter 是洗衣服机器人,它们可以帮助您将脏衣服放入洗衣机中并分别返还给您。他们都有随身携带的小篮子(缓冲区)。

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

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

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

关于java - 为什么FileReader没有flush,而FileWriter有呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64618498/

相关文章:

file - 防止 nano 在收到 SIGHUP 或 SIGTERM 时创建保存文件

Java 在字符串中搜索子字符串除非前面有特定字符

java - I/O 操作中 CPU 使用率 100%

java - 从慢速流读取时,BufferedReader.readLine() 是否可能不读取整行?

scala - 理解 Scala 中的 IO-monad

c - 为什么改变 SO_RCVBUF 的值不起作用?

c++ - 当我将 stdin 和 ungetc 的缓冲区关闭到 stdin 时发生了什么?

java - 如何在Piccolo2D中接收键盘事件?

java - 优化使用数据压缩的 Java 服务器

JavaFX 动态 TableView 不显示数据库中的数据