Java BufferedInputStream如何使读取操作更快?
我知道围绕FileInputStream包装BufferedInputStream会使读取操作更快,但仍在尝试 我查阅了BufferedInputStream的源代码,得到了一些东西。这是我的 理解力Java BufferedInputStream如何使读取操作更快?,java,bufferedinputstream,Java,Bufferedinputstream,我知道围绕FileInputStream包装BufferedInputStream会使读取操作更快,但仍在尝试 我查阅了BufferedInputStream的源代码,得到了一些东西。这是我的 理解力 InputStream in = new BufferedInpurStream(new FileInputStream(filename)); int byteToRead; while((byteToRead = in.read()) != -1) 当我在内部执行BufferedIn
InputStream in = new BufferedInpurStream(new FileInputStream(filename));
int byteToRead;
while((byteToRead = in.read()) != -1)
当我在内部执行BufferedInputStream.read()时,它将首先在缓冲区中一次读取字节块,然后
从缓冲区一个接一个地读取每个字节,而不是从文件(成本更高)中读取。一旦缓冲区为空
它将用字节块再次填充它
在使用FileInputStream.read()时,从文件中逐个执行读取操作,这非常昂贵
这种理解正确吗?是的。正如您所描述的,BufferedInputStream极大地减少了每次从流中读取一个字节时所进行的IO调用的数量(因为大多数read()调用都会命中缓冲区)。通常,read(byte[]b)(或read(byte[]b,int off,int len))比read()更受欢迎,因为它可能具有一些IO性能优势 如果使用read(byte[]b),只要使用相同的缓冲区大小,BufferedInputStream就没有任何实际优势
void read(InputStream inputStream, int bufferSize) throws IOException
{
byte[] buffer = new byte[bufferSize];
int read;
while ((read = inputStream.read(buffer)) != -1)
{
// do some work
}
}
及
尝试阅读和阅读2。您会发现,只要使用适当的缓冲区大小,包装到BufferedInputStream并不会提高性能。(实际上,这会造成另一个计算成本…)
那么,什么时候需要BufferedInputStream?
以下是我的建议:
- 如果您知道“适当”的缓冲区大小,只需直接处理它。它产生更短的代码。 (例如:文件读取。您可以使用文件大小作为缓冲区大小。)
- 如果您不知道“适当”的缓冲区大小,或者必须将InputStream传递到另一个库,请将该流包装为BufferedInputStream。 您可能会从缓冲中受益。(例如:Web文件传输。服务器可能不提供内容长度字段。)
void read2(InputStream inputStream, int bufferSize) throws IOException
{
BufferedInputStream bis = new BufferedInputStream(inputStream, bufferSize);
try
{
byte[] buffer = new byte[bufferSize];
int read;
while ((read = bis .read(buffer)) != -1)
{
// do some work
}
}
finally
{
bis.close();
}
}