美文网首页
流的read()方法返回的长度的重要性

流的read()方法返回的长度的重要性

作者: 马木木 | 来源:发表于2020-05-11 21:05 被阅读0次

前几天在定位生产问题时,由于日志中的JSON格式的List集合是不去重的,想看看去重后的数量,太长不能直接拷贝为String类型的值,就想着放到一个文件中写个main()读取转换下,发现明明读取应该结束了,但是最后的结果总是比文件中多那么些。最后发现是忽略了read()返回的len的问题,做个记录

Main()方法

public static void main(String[] args) {

        try (FileReader reader = new FileReader(new File("E:\\ideaWorkspace\\testProject\\src\\main\\java\\test\\crowdList.txt"))){
            char[] buf = new char[100];
            int len;
            StringBuilder sb = new StringBuilder();
            while ((len = reader.read(buf)) != -1) {

                String str = new String(buf);
                sb.append(str);

            }

            List<String> strings = JSON.parseArray(sb.toString(), String.class);
            System.out.println(strings.size());
            Set<String> deSet = new HashSet<>(strings);
            System.out.println(deSet.size());


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

分析下

乍一看感觉没啥问题,但是出错了,错误的内容是

image

是阿里巴巴的fastJson报出来的说不是一个闭合的json字符串,但是文件中确实是个有开闭的符号的,我们把每一行都打出来看看

image

我们可以看到明明结束的打印出来之后,后边又打出来了一串,而且这一串和上边的一模一样

结论

到这边就能看出来了,最后一次read()肯定是没有把我们用来存储内容的数组装满就是代码中的buf,装了多少呢,其实就是从0开始len个长度,剩下的还是上一次读取存在里边的,那就有两种思路了

  • 每次读取后清空缓存数组(每次初始化还是有性能损失)
while ((len = reader.read(buf)) != -1) {
    String str = new String(buf);
    sb.append(str);
    buf = new char[100];
}
  • 存储读取结果时只取前len个长度(读多少用多少,这个比较好)
while ((len = reader.read(buf)) != -1) {
    String str = new String(buf,0,len);
    sb.append(str);
}

相关文章

  • 流的read()方法返回的长度的重要性

    前几天在定位生产问题时,由于日志中的JSON格式的List集合是不去重的,想看看去重后的数量,太长不能直接拷贝为S...

  • IO

    概念 方法 常见问题 (read()方法返回值为什么是int)read()方法读取的是一个字节,为什么返回是int...

  • urllib

    urlopen返回对象提供方法: read() , readline() ,readlines() , filen...

  • python基本类型自定义方法

    字符串自带的方法不够时,自定义方法。 比如字符串的长度小于2,返回True, 字符串的长度大于等于5,返回Fals...

  • JS中字符串的常见属性和方法

    属性 length:返回字符串的长度 方法 charAt():返回指定索引位置的字符 charCodeAt():返...

  • Vue学习笔记-数组操作

    变异方法 push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。 pop() 方法用于删除并返回数组...

  • Javascript string对象

    charAt() 方法 .charAt(num) 方法可返回指定位置的字符,返回的字符是长度为 1 的字符串。 c...

  • length()和length

    length()是字符串的一个方法,返回调用对象的长度 length是数组的一个属性,返回数组的长度 注意:当字符...

  • 数组api

    常用方法(4321+221) 4push() 返回数组的长度pop() ...

  • FCC 255 - 找出最长单词

    在句子中找出最长的单词,并返回它的长度。函数的返回值应该是一个数字。当你完成不了挑战的时候,记得开大招'Read-...

网友评论

      本文标题:流的read()方法返回的长度的重要性

      本文链接:https://www.haomeiwen.com/subject/hanuyctx.html