BufferedInputStream用例在网络套接字和文件读取中?

时间:2017-01-27 05:09:30

标签: java sockets file-io bufferedinputstream

我对使用BufferedInputStream有几个问题:

首先,我听说如果从特别是HDD逐字节读取数据,BufferedInputStream会显着提高性能。

  1. 如果我使用4098字节的chuck读取整个文件,是否使用FileInputStream或BufferedInputStream会产生重大影响吗?

    ByteArrayOutputStream result = new ByteArrayOutputStream();
    
        try(FileInputStream fis = new FileInputStream(filePath)) {
    
            // Create some arbitrary buffer
            byte[] buffer = new byte[4098];
    
            int length;
    
            while ((length = fis.read(buffer)) != -1) {
                result.write(buffer, 0, length);
            }
        }
    
        return result.toByteArray();
    

    使用BufferedInputStream会在这里证明非常有用吗?

  2. 同样地,BufferedInputStream在逐字节读取时是否只对套接字产生影响,即它只对预加载缓冲区逐字节读取有用吗?

2 个答案:

答案 0 :(得分:0)

  

使用FileInputStream或是否会产生显着差异   BufferedInputStream,如果我在4098中读取整个文件   bytes chunk?

BufferedInputStream在这个例子中可能没什么区别。首先,您已经使用4098字节缓冲区调用FileInputStream.read,无论如何它将以4098字节的块为单位获取数据。这是您需要合理地从磁盘文件中获取数据的所有“缓冲分块”。

  

以同样的方式,BufferedInputStream只会有所作为   逐字节读取时的套接字,即它只对它有用   预先加载缓冲区以逐字节读取?

如果一次获取一个字节(来自套接字或文件),使用BufferedInputStream包装流可能会有所不同。即使操作系统已经在内核中缓冲读取,一次读取一个字节会导致切换到内核模式以从每次调用的内核缓冲区中获取单个字节。这是低效的,并且是使用BufferedInputStream的一个很好的理由。

答案 1 :(得分:-1)

非缓冲流一次读取数据k个字节(k是页面大小; OS只能读取OS页面大小的倍数,数据可以从磁盘块大小的倍数读取)来自OS缓存(可能或者可能无法从磁盘读取取决于它是否已经在OS缓存中。另一方面,缓冲流读取缓冲容量的块。因此,您可以节省宝贵的磁盘IO读数。缓冲区容量应该是页面大小的倍数,而应该是磁盘块大小的倍数。