Java io 中的带缓冲的 inputstream 读取时,缓冲区为什么不用清除啊?

2020-09-07 23:43:58 +08:00
 qaqLjj
public class Trans {
  public static void main(String[] args) {
    try {
      readFile();
    } catch (IOException e) {
      e.printStackTrace();
  }
}
  public static void readFile() throws IOException {
    try (InputStreamReader reader=new InputStreamReader(new FileInputStream("se.md"),"UTF-8");) {
      char[] buffer = new char[1000];
      int n;
      while ((n = reader.read(buffer)) != -1) {
        System.out.println("read " + n + " chars.");
     }
   }
  }
}

打印如下

read 1000 chars.
read 1000 chars.
read 1000 chars.
read 1000 chars.
read 1000 chars.
read 1000 chars.
read 1000 chars.
read 1000 chars.
read 1000 chars.
read 1000 chars.
read 305 chars.

char 类型数组 buffer 难道不是应该读一次清空一次吗?
如果不清空的话,buffer 一次就都读满了,没空间放新读的了就应该停下呀?

2828 次点击
所在节点    Java
10 条回复
mind3x
2020-09-08 00:23:34 +08:00
……竟然无法反驳

讲真,有没有空间放,是你自己代码的事,不是 API 的事。API 只管往你给的 buffer 里填,至于填了以后你怎么处理这个 buffer 是你的事,难不成一个 read 还要帮你操心你接下来的逻辑么。
Lonely
2020-09-08 02:50:20 +08:00
不用清空也能往里面塞数据哇,这不就达到复用的效果了。
wangsongyan
2020-09-08 05:38:26 +08:00
数组赋值,没毛病
yidinghe
2020-09-08 07:43:47 +08:00
read 方法不管 buffer 数组的当前内容怎么样,都会从开头开始填充,覆盖原来的内容。所以当你认为可以重新填充了,才会调这个方法。
zpf124
2020-09-08 10:21:46 +08:00
你在用现实的逻辑去猜想 电路逻辑。

现实中 你三个桶放了东西不倒出来没法放新的东西,然而电路层面并不像桶,更不是在往桶里放东西。

非要是比喻的话,更像是在贴贴纸,我才不管你这原来下边是啥颜色的,我在上面糊一层啥颜色的纸就是啥颜色,下次再换颜色我还要把过去的贴纸扣掉??? 不!直接再糊一层就完事了。
zsdroid
2020-09-08 10:38:13 +08:00
典型的脑子转不过弯来。buffer[0]='a';buffer[0]='b';buffer[0]='c';有问题吗
dadachen1997
2020-09-08 10:43:15 +08:00
继续 read 就是覆盖填充,不 read 也没必要专门擦除 buffer 吧,最后直接释放掉完事了。
togou
2020-09-08 12:11:59 +08:00
缓冲区这个概念就一直混淆人,TCP 的缓冲区更有那味
qaqLjj
2020-09-08 21:00:24 +08:00
明白了 谢谢大家
qm332207252
2020-09-09 17:08:49 +08:00
类似的,在操作系统中你删除文件并不是真的将硬盘上的文件“删除”。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/705022

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX