Java 网络套接字和文件读取中的BufferedInputStream用例?
关于BufferedInputStream的使用,我有几个问题: 首先,我听说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
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会证明非常有用吗非缓冲流从操作系统缓存一次读取数据k字节(k表示页面大小;操作系统只能读取操作系统页面大小的倍数,并且可以从磁盘读取磁盘块大小的倍数)(是否从磁盘读取取决于它是否已在操作系统缓存中)。另一方面,缓冲流读取缓冲区容量的块。因此,您可以节省宝贵的磁盘IO读取。缓冲区容量应该是页面大小的倍数,而页面大小应该是磁盘块大小的倍数 我使用FileInputStream还是 BufferedInputStream,如果我正在使用4098读取整个文件 字节块 在本例中,BufferedInputStream可能没有什么不同。首先,您已经使用4098字节的缓冲区调用了FileInputStream.read,该缓冲区将以4098字节的块获取数据。这就是从磁盘文件中合理获取数据所需的所有“缓冲分块” 同样,BufferedInputStream是否仅在 逐字节读取时的套接字,即它仅对 预加载缓冲区以逐字节读取
如果一次提取一个字节(从套接字或文件中),则使用BufferedInputStream包装流可能会有所不同。即使操作系统已经在内核中缓冲您的读取,每次读取一个字节也会导致切换到内核模式,以便为每次调用从内核的缓冲区中获取一个字节。这是效率低下的,也是使用BufferedInputStream的一个很好的理由。下定决心吧。一次一个字节或一次多个字节。不是同时使用两个字节。我使用了一个字节,因为我不想因为页面大小和块大小的细节而变得复杂;同时,您不希望对用户完全隐藏实际值。如果没有基础流,您无论如何都不能使用BufferedInputStream。此外,4096或8192或x或y或z完全取决于操作系统和文件系统。通常是2的幂。缓冲区大小应该是页面大小的倍数。