Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 网络套接字和文件读取中的BufferedInputStream用例?_Java_Sockets_File Io_Bufferedinputstream - Fatal编程技术网

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

Java 网络套接字和文件读取中的BufferedInputStream用例?,java,sockets,file-io,bufferedinputstream,Java,Sockets,File Io,Bufferedinputstream,关于BufferedInputStream的使用,我有几个问题: 首先,我听说BufferedInputStream可以显著提高性能,如果您从硬盘上逐字节读取数据的话 如果我读取的是4098字节的整个文件,那么使用FileInputStream还是BufferedInputStream会有很大的区别吗 ByteArrayOutputStream result = new ByteArrayOutputStream(); try(FileInputStream fis = new Fil

关于BufferedInputStream的使用,我有几个问题:

首先,我听说BufferedInputStream可以显著提高性能,如果您从硬盘上逐字节读取数据的话

  • 如果我读取的是4098字节的整个文件,那么使用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会证明非常有用吗

  • 同样,BufferedInputStream在逐字节读取时是否仅在套接字中起作用,即逐字节读取是否仅对预加载缓冲区有用


  • 非缓冲流从操作系统缓存一次读取数据k字节(k表示页面大小;操作系统只能读取操作系统页面大小的倍数,并且可以从磁盘读取磁盘块大小的倍数)(是否从磁盘读取取决于它是否已在操作系统缓存中)。另一方面,缓冲流读取缓冲区容量的块。因此,您可以节省宝贵的磁盘IO读取。缓冲区容量应该是页面大小的倍数,而页面大小应该是磁盘块大小的倍数

    我使用FileInputStream还是 BufferedInputStream,如果我正在使用4098读取整个文件 字节块

    在本例中,BufferedInputStream可能没有什么不同。首先,您已经使用4098字节的缓冲区调用了FileInputStream.read,该缓冲区将以4098字节的块获取数据。这就是从磁盘文件中合理获取数据所需的所有“缓冲分块”

    同样,BufferedInputStream是否仅在 逐字节读取时的套接字,即它仅对 预加载缓冲区以逐字节读取


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

    下定决心吧。一次一个字节或一次多个字节。不是同时使用两个字节。我使用了一个字节,因为我不想因为页面大小和块大小的细节而变得复杂;同时,您不希望对用户完全隐藏实际值。如果没有基础流,您无论如何都不能使用BufferedInputStream。此外,4096或8192或x或y或z完全取决于操作系统和文件系统。通常是2的幂。缓冲区大小应该是页面大小的倍数。