我应该总是将InputStream包装为BufferedInputStream吗?

gee*_*jay 40 java stream java-io

当我知道给定的InputStream是否不是缓冲的时候,总是将InputStream包装为BufferedInputStream是否有意义?例如:

InputStream is = API.getFromSomewhere()
if(!(is instanceof BufferedInputStream))
  return new BufferedInputStream(is);
return is;
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 34

当我知道给定的InputStream是否不是缓冲的时候,总是将InputStream包装为BufferedInputStream 是否有意义?

没有.

如果您可能执行大量小读取(一次一个字节或几个字节),或者如果您想使用缓冲API提供的某些更高级别功能,则这是有意义的; 例如,该BufferedReader.readLine()方法.

但是,如果您只是使用read(byte[])和/或read(byte[], int, int)方法执行大块读取,则包装InputStream在a BufferedInputStream中无济于事.

(回应@Peter Tillman对自己的答案的评论,块读取用例肯定代表了超过0.1%的InputStream类的使用!!但是,他是正确的,因为在使用缓冲的API时通常是无害的你不需要.)


Pet*_*ans 6

我不会这样做,我会把它留在最高的抽象级别.如果您不打算使用BufferedStream的标记和重置功能,为什么还要包装呢?

如果消费者需要它,最好将它包装在那里.

  • 这似乎意味着标记和重置是`BufferedInputStream`在普通的`InputStream`上添加的唯一有用的东西.从API意义上看,这可能是正确的,但正如其他人所说,"BufferedInputStream"负责为您缓冲读取.从一个"FileInputStream"中读取一个字节的速度比从"BufferedInputStream"中包含的读取速度快40倍.也就是说,返回`InputStream`并保持你的方法签名.用户可以根据需要进行换行. (7认同)