一个简单的IO 问题

Edwin603 2009-07-20 08:18:57
请问 为什么 read() 后不用清空 就可以读取文件 而write() 后必须用flush()后才能写文件
到底这个过程是怎么回事 我认为Writer是把数据先写到输出流里 然后必须手动的清空或者关闭流 要写的东西
才能被写到 目的文件中 可是Reader 为什么不用清空 也不用关闭流 就可以度取呢? 难道不是先把读到的东西先放入
流中吗 如果是 那为什么不清空呢?
...全文
116 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovetysx 2009-07-22
  • 打赏
  • 举报
回复
头像很可爱
bigbug9002 2009-07-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 edwin603 的回复:]
那个 我不是问 要不要清空 和清空的好处和坏处
我要问的是 read()不用清空就可以读 这是为什么 这个过程是什么
read()和write() 2个有什么区别 为什么都有缓冲 一个不清空就能读 一个必须清空才能写!
[/Quote]
flush是把缓冲区中没有写出去的内容写入文件(或者是其它的流)。这关系到数据的完整性。
对于read来说,如果缓冲中还有没有读完的数据,为什么要清空缓冲呢?如果读完了缓冲,会自动把新的数据从流中填入缓冲,我是这样理解的。
对于write来说,也是一样,你可以一直writ,缓冲满了会自动把缓冲中的内容写入流。flush的作用就是缓冲还没有满时,把缓冲中的内容写出去。

为什么write要flush?,那是因为当缓冲没有写满时,整个写操作结束了,比如程序要终止了,这时要把缓冲中剩余的内容写到流中,如果没有flush方法,缓冲中的内容不会自动写入流。而read就没有清空缓冲的理由。

Edwin603 2009-07-21
  • 打赏
  • 举报
回复
那个 我不是问 要不要清空 和清空的好处和坏处
我要问的是 read()不用清空就可以读 这是为什么 这个过程是什么
read()和write() 2个有什么区别 为什么都有缓冲 一个不清空就能读 一个必须清空才能写!
bigbug9002 2009-07-21
  • 打赏
  • 举报
回复
write关系到写入文件的数据的完整性。read不涉及这个问题。
不应该每write一次就flush一次,之所以用缓冲,就是为了提高IO操作的效率,如果每写一次都flush一次,不如不用缓冲,直接写文件好了。
Edwin603 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhengkaifl 的回复:]
其实写数据到文件也可以不用刷新,因为在你关闭流的时候底层已经调用了flush()刷新方法了。但是如果你要实现即时的将数据写入到文件中,就需要写一次就刷新一次。
向文件写入数据时,不是直接就将数据向文件中写,而是先写到一个缓存区中,当你将缓冲区写满了,就会自动将缓存中的数据写入到文件中,并将缓存清空,这就是一次刷新的过程。读一下就刷新一次是防止你忘记手动关闭流而采取的策略。因为假设你忘记手动关闭流,而你最后一次缓存区又没有写满,那么这些数据就会一直保存在缓冲区中,而不会写入到文件中。
所以为了以防万一,就每写一次就刷新一次,就可以及时的将数据都写入到文件中
[/Quote]
我问的是读文件 哎
Clarity-Black 2009-07-21
  • 打赏
  • 举报
回复
其实写数据到文件也可以不用刷新,因为在你关闭流的时候底层已经调用了flush()刷新方法了。但是如果你要实现即时的将数据写入到文件中,就需要写一次就刷新一次。
向文件写入数据时,不是直接就将数据向文件中写,而是先写到一个缓存区中,当你将缓冲区写满了,就会自动将缓存中的数据写入到文件中,并将缓存清空,这就是一次刷新的过程。读一下就刷新一次是防止你忘记手动关闭流而采取的策略。因为假设你忘记手动关闭流,而你最后一次缓存区又没有写满,那么这些数据就会一直保存在缓冲区中,而不会写入到文件中。
所以为了以防万一,就每写一次就刷新一次,就可以及时的将数据都写入到文件中
Edwin603 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lasfrost 的回复:]
对于原始的OutputStream和Writer在write之后数据直接写入IO中,不需要flush(虽然接口中提供了flush方法),需要flush的是带缓冲的输出流,意义是把数据从缓冲区刷入IO,这样才能达到实际目的。
对于输入流,当你read的时候你已经得到数据并保存到变量中了,已经达到了实际目的,没必要再去操作缓冲区。
[/Quote]
谢谢指点 你的后半段话 我认同
但是前半段话 貌似有点错吧 你自己试验试验 不清空 能写入吗?
lasfrost 2009-07-20
  • 打赏
  • 举报
回复
对于原始的OutputStream和Writer在write之后数据直接写入IO中,不需要flush(虽然接口中提供了flush方法),需要flush的是带缓冲的输出流,意义是把数据从缓冲区刷入IO,这样才能达到实际目的。
对于输入流,当你read的时候你已经得到数据并保存到变量中了,已经达到了实际目的,没必要再去操作缓冲区。
Edwin603 2009-07-20
  • 打赏
  • 举报
回复
FileWriter 有缓冲区吗
BufferedWriter(new FileWriter()) 才有吧
黑夜愁客 2009-07-20
  • 打赏
  • 举报
回复
  FileOutputStream   file   =   new   FileOutputStream("c:\userInfo.ser");  
ObjectOutputStream out = new ObjectOutputStream(file);
out.writeObject(user);
out.flush();
......
黑夜愁客 2009-07-20
  • 打赏
  • 举报
回复
为了提高处理效率,write是写到缓冲区中,当缓冲区满或close时系统会自动将缓冲区的内容写入文件,所以一般是不需要调用flush的。不过如果你需要使write马上写入到文件中,就需要调用flush

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧