MarkLazy
V2EX  ›  Java

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

  •  
  •   MarkLazy · Sep 7, 2020 · 4254 views
    This topic created in 2248 days ago, the information mentioned may be changed or developed.
    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 replies  •  2020-09-09 17:08:49 +08:00
    mind3x
    mind3x
    Sep 8, 2020
    1
    ……竟然无法反驳

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

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

    非要是比喻的话,更像是在贴贴纸,我才不管你这原来下边是啥颜色的,我在上面糊一层啥颜色的纸就是啥颜色,下次再换颜色我还要把过去的贴纸扣掉??? 不!直接再糊一层就完事了。
    zsdroid
    zsdroid
    Sep 8, 2020
    6
    典型的脑子转不过弯来。buffer[0]='a';buffer[0]='b';buffer[0]='c';有问题吗
    dadachen1997
    dadachen1997
    Sep 8, 2020
    7
    继续 read 就是覆盖填充,不 read 也没必要专门擦除 buffer 吧,最后直接释放掉完事了。
    togou
    togou
    Sep 8, 2020
    8
    缓冲区这个概念就一直混淆人,TCP 的缓冲区更有那味
    MarkLazy
    MarkLazy
    OP
    Sep 8, 2020
    9
    明白了 谢谢大家
    qm332207252
    qm332207252
    Sep 9, 2020
    10
    类似的,在操作系统中你删除文件并不是真的将硬盘上的文件“删除”。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1335 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 19:24 · PVG 03:24 · LAX 11:24 · JFK 14:24
    ♥ Do have faith in what you're doing.