首页 新闻 会员 周边

关于BufferedInputStream的缓冲区

0
悬赏园豆:100 [待解决问题]

先上个代码参考:
public static void testFileInputStream() throws IOException {
        File f = new File("d:" + File.separator + "demo.txt");
        InputStream input = new FileInputStream(f);
        byte[] byteArray = new byte[8192];
        int tmp = 0;
        while ((tmp = input.read(byteArray)) != -1) {
            System.out.println("something1");
        }
        if (input != null) {
            input.close();
        }
    }
    
    public static void testBufferedInputStream() throws IOException {
        File f = new File("d:" + File.separator + "demo.txt");
        InputStream input = new FileInputStream(f);
        BufferedInputStream bis = new BufferedInputStream(input);
        byte[] byteArray = new byte[SIZE];
        int tmp = 0;
        while ((tmp = bis.read(byteArray)) != -1) {
            System.out.println("something2");
        }
        if (input != null) {
            input.close();
        }
        if (bis != null) {
            bis.close();
        }

    }
最近在看源码。就拿testFileInputStream来比较。如果 read(byteArray) 的byteArray的长度设置的大于或等于BufferedInputStream的缓冲区大小,那 BufferedInputStream还有什么优势呢?
在BufferedInputStream 的
private int read1(byte[] b, int off, int len) throws IOException
方法里有这么个注释:
 If the requested length is at least as large as the buffer, and
           if there is no mark/reset activity, do not bother to copy the
           bytes into the local buffer.  In this way buffered streams will
           cascade harmlessly.
也就是说如果byteArray的长度大于或者等于buffer的缓冲区长度,那么缓冲区就不起作用了。  我的疑问是:read(byteArray),永远都可以设置的    大于或者等于    buffer的缓冲区长度,我还要        BufferedInputStream 做什么? 难道读取一定量字节(比如1000b):①
一次性读取 1000b     ② 一点点读取 (100b,读取10次) 然后放到缓冲区    第②种比① 有什么优势吗?
本人才疏学浅,望大神指正

aoaoaa的主页 aoaoaa | 初学一级 | 园豆:102
提问于:2018-06-28 12:43
< >
分享
所有回答(2)
0

我看代码,不是你说的那样啊,你设置size 都是在不同对象上设置的。缓冲区  我的理解就是   我要搬家  我每次都要跑到原来的家里拿一个东西之后再放到新家里,可是自从有了车后,我直接将所有的东西放到车里拖到新家门口,然后再从车里拿东西放到新家。

^keepHungry$ | 园豆:516 (小虾三级) | 2018-06-29 10:56

就拿你举的例子来说我的问题是:我要搬家

1.我每次跑到原来的家里可以直接拿100个东西之后再放到新家里(fileinputStream)

2.自从有了车后,我每次拿10个东西共拿10次,将所有的东西放到车里拖到新家门口,然后再从车里拿东西放到新家(bufferinputstream)

这两种方法都可以拿100个东西。那我要bufferedinputstream有啥用

 

支持(0) 反对(0) aoaoaa | 园豆:102 (初学一级) | 2018-06-29 13:58

@aoaoaa: 就问  你之前一次般100个东西  累不累,走起路来能快?或许 还丢三落四的(我个人觉得 缓冲区 是对读数据比较大的时候才会有明显的作用。)不要觉得分10次拿和一次拿 都可以实现需求,但是可能速度和质量的问题不同。

支持(0) 反对(0) ^keepHungry$ | 园豆:516 (小虾三级) | 2018-06-29 14:06

@^keepHungry$:嗯。所以我一开始就问第②种比① 有什么优势,①有什么缺点  阻塞?还是什么。在网上搜不到答案,只好来问问了

支持(0) 反对(0) aoaoaa | 园豆:102 (初学一级) | 2018-06-29 14:14
0

额,缓冲类的功能是将字节流变为字符流。具体实用的方法就是将System.in作为字节输入流读取用户的输入。
它是读取键盘输入的标准格式,是很根本的东西,现在有scanner了可也不能忘记实现的原理

一只小鲸鱼 | 园豆:202 (菜鸟二级) | 2018-09-28 22:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册