通常,read(byte[] b)(或 read(byte[] b, int off, int len)) 比 read() 更受欢迎,因为它可能具有一些 IO 性能优势。
如果您使用 read(byte[] b),只要您使用相同的缓冲区大小,BufferedInpurStream 就没有实际优势。
void read(InputStream inputStream, int bufferSize) throws IOException
{
byte[] buffer = new byte[bufferSize];
int read;
while ((read = inputStream.read(buffer)) != -1)
{
// do some work
}
}
和
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();
}
}
尝试阅读和阅读2。您会发现,只要您使用适当的缓冲区大小,Wrapping to BufferedInputStream 并不会提高性能。(实际上它会产生另一个计算成本......)
那么,什么时候需要 BufferedInputStream?这是我的建议:
- 如果您知道“适当的”缓冲区大小,请直接处理。它产生更短的代码。(例如:文件读取。您可以使用文件大小作为缓冲区大小。)
- 如果您不知道“适当的”缓冲区大小,或者您必须将 InputStream 传递给另一个库,请将流包装为 BufferedInputStream。您可能会从缓冲中受益。(例如:Web 文件传输。服务器可能不提供内容长度字段。)