【Java】请教输入流缓冲区的问题

TRANSCEND100 2017-11-23 04:09:10
缓冲区就是存在于内存中的一个数组。对于输出流,输出的数据会先进入缓冲区,缓冲区满再自动刷新到硬盘的文件中,因为减少了内存和硬盘之间的读写次数,所以提高了效率。
不知道我这样理解对不对?如果对的话,那么请教一下这个问题:对于输入流,反正从硬盘的文件读取数据后都是进入内存的,而缓冲区也是在内存中的,那输入流的缓冲区不是多余的吗?
对这个问题想不明白,希望理解的各位帮忙解释一下,感谢各位!
...全文
199 6 点赞 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
TRANSCEND100 2017-11-24
引用 1 楼 qq_34350475 的回复:
打个比方,港口运货,一种方法是先将货物装在集装箱里都运到港口等待货轮到达,另一种是货轮到达港口才开始从仓库往港口运货,显而易见,前者效率高。缓冲区也是为了缓解设备间读写速度不匹配而设置的一种处理方式,就像港口。而缓存,是将获取的一部分数据保留下来,以便下次需要的时候直接读取,而不用到硬盘中去读取,减少读写次数,提高效率。
假设缓存是1024字节,即使用read()方法读取一次,也会读取1024字节到缓存,下次再调用read()方法就直接从缓存读取。是这个意思吗?
  • 打赏
  • 举报
回复
qq_34350475 2017-11-24
打个比方,港口运货,一种方法是先将货物装在集装箱里都运到港口等待货轮到达,另一种是货轮到达港口才开始从仓库往港口运货,显而易见,前者效率高。缓冲区也是为了缓解设备间读写速度不匹配而设置的一种处理方式,就像港口。而缓存,是将获取的一部分数据保留下来,以便下次需要的时候直接读取,而不用到硬盘中去读取,减少读写次数,提高效率。
  • 打赏
  • 举报
回复
TRANSCEND100 2017-11-24
引用 3 楼 ldh911 的回复:
要复杂解释的话还挺麻烦的,毕竟缓冲区也有很多不同层级。设法简单举个例子: 1、如果你的程序每次都只是read(1024)这样,而且硬盘确确实实忠实的据此执行了,那么你说的情况大致差不多。 2、但如果操作系统按照文件系统的扇区大小设置了缓冲区,比如64K,那么在连续读取的情况下,你的程序执行64次,硬盘实际动作只需要一次。 以上两种情况,后者速度是前者的xxoo倍?
好的,现在已经明白了,感谢回复!
  • 打赏
  • 举报
回复
TRANSCEND100 2017-11-24
引用 4 楼 qq_34350475 的回复:
[quote=引用 2 楼 TRANSCEND100 的回复:] [quote=引用 1 楼 qq_34350475 的回复:] 打个比方,港口运货,一种方法是先将货物装在集装箱里都运到港口等待货轮到达,另一种是货轮到达港口才开始从仓库往港口运货,显而易见,前者效率高。缓冲区也是为了缓解设备间读写速度不匹配而设置的一种处理方式,就像港口。而缓存,是将获取的一部分数据保留下来,以便下次需要的时候直接读取,而不用到硬盘中去读取,减少读写次数,提高效率。
假设缓存是1024字节,即使用read()方法读取一次,也会读取1024字节到缓存,下次再调用read()方法就直接从缓存读取。是这个意思吗?[/quote] 感觉你又像是在说缓冲区又是在说缓存? 如果你指的是read从缓冲区读,那么就是一次取出一块数据(假设1024字节)到缓冲区,然后read方法一个字节一个字节去慢慢读,同时IO设备可以进行其他任务,如果没有缓冲区,就得一个字节一个字节地从磁盘取,一直占用着IO开销。 缓存的话,是假设你需要经常读取一份文件,那就把它放到缓存里,每次请求的时候,都可以直接在缓存里找到,不用去磁盘里取。[/quote] 嗯,这下明白了,谢谢!
  • 打赏
  • 举报
回复
qq_34350475 2017-11-24
引用 2 楼 TRANSCEND100 的回复:
[quote=引用 1 楼 qq_34350475 的回复:] 打个比方,港口运货,一种方法是先将货物装在集装箱里都运到港口等待货轮到达,另一种是货轮到达港口才开始从仓库往港口运货,显而易见,前者效率高。缓冲区也是为了缓解设备间读写速度不匹配而设置的一种处理方式,就像港口。而缓存,是将获取的一部分数据保留下来,以便下次需要的时候直接读取,而不用到硬盘中去读取,减少读写次数,提高效率。
假设缓存是1024字节,即使用read()方法读取一次,也会读取1024字节到缓存,下次再调用read()方法就直接从缓存读取。是这个意思吗?[/quote] 感觉你又像是在说缓冲区又是在说缓存? 如果你指的是read从缓冲区读,那么就是一次取出一块数据(假设1024字节)到缓冲区,然后read方法一个字节一个字节去慢慢读,同时IO设备可以进行其他任务,如果没有缓冲区,就得一个字节一个字节地从磁盘取,一直占用着IO开销。 缓存的话,是假设你需要经常读取一份文件,那就把它放到缓存里,每次请求的时候,都可以直接在缓存里找到,不用去磁盘里取。
  • 打赏
  • 举报
回复
MiceRice 2017-11-24
要复杂解释的话还挺麻烦的,毕竟缓冲区也有很多不同层级。设法简单举个例子: 1、如果你的程序每次都只是read(1024)这样,而且硬盘确确实实忠实的据此执行了,那么你说的情况大致差不多。 2、但如果操作系统按照文件系统的扇区大小设置了缓冲区,比如64K,那么在连续读取的情况下,你的程序执行64次,硬盘实际动作只需要一次。 以上两种情况,后者速度是前者的xxoo倍?
  • 打赏
  • 举报
回复
相关推荐
发帖
Java SE
加入

6.2w+

社区成员

Java 2 Standard Edition
申请成为版主
帖子事件
创建了帖子
2017-11-23 04:09
社区公告
暂无公告