V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qaqLjj
V2EX  ›  Java

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

  •  
  •   qaqLjj · 2020-09-07 23:43:58 +08:00 · 2977 次点击
    这是一个创建于 1536 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 一次就都读满了,没空间放新读的了就应该停下呀?

    10 条回复    2020-09-09 17:08:49 +08:00
    mind3x
        1
    mind3x  
       2020-09-08 00:23:34 +08:00
    ……竟然无法反驳

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

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

    非要是比喻的话,更像是在贴贴纸,我才不管你这原来下边是啥颜色的,我在上面糊一层啥颜色的纸就是啥颜色,下次再换颜色我还要把过去的贴纸扣掉??? 不!直接再糊一层就完事了。
    zsdroid
        6
    zsdroid  
       2020-09-08 10:38:13 +08:00
    典型的脑子转不过弯来。buffer[0]='a';buffer[0]='b';buffer[0]='c';有问题吗
    dadachen1997
        7
    dadachen1997  
       2020-09-08 10:43:15 +08:00
    继续 read 就是覆盖填充,不 read 也没必要专门擦除 buffer 吧,最后直接释放掉完事了。
    togou
        8
    togou  
       2020-09-08 12:11:59 +08:00
    缓冲区这个概念就一直混淆人,TCP 的缓冲区更有那味
    qaqLjj
        9
    qaqLjj  
    OP
       2020-09-08 21:00:24 +08:00
    明白了 谢谢大家
    qm332207252
        10
    qm332207252  
       2020-09-09 17:08:49 +08:00
    类似的,在操作系统中你删除文件并不是真的将硬盘上的文件“删除”。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2626 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 15:14 · PVG 23:14 · LAX 07:14 · JFK 10:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.