假设我有一个接受InputStream的方法。
此方法需要使用BufferedInputStream封装此InputStream才能使用其标记和重置功能。但是,传入的InputStream可能仍由该方法的调用者使用。
public static void foo(InputStream is) throws Exception {
BufferedInputStream bis = new BufferedInputStream(is);
int b = bis.read();
}
public static void main(String[] args) {
try {
InputStream is = new FileInputStream(someFile);
foo(is);
int b = is.read(); // return -1
}catch (Exception e) {
e.printStackTrace();
}
}
我的问题是:读取(或初始化)BufferedInputStream时,原始InputStream究竟发生了什么?
我的假设是,如果读取BufferedInputStream,原始InputStream也将向前移动。但是,调试我的代码后,我发现InputStream在读取时将返回-1。
如果在此过程之后原始InputStream不可读,那么我应该如何实现我的目的:
InputStream is;
foo(is); // Method only take in generic InputStream object
// Processing of the passed in InputStream object require mark and reset functionality
int b = is.read(); // Return the next byte after the last byte that is read by foo()
编辑:
我想我要的是很通用的,因此需要很多工作。至于我正在做的事情,实际上我并不需要全部的标记和重置功能,因此我发现了一些小解决方法。但是,我将在此处保留问题的第二部分,因此随时尝试这个问题:)。
最佳答案
BufferedInputStream
的默认bufferSize为8192,因此当您从BufferedInputStream
读取时,它会尝试填充其缓冲区。因此,如果您必须从InputStream
中读取比bufferSize
少的字节,那么InputStream
的全部内容将被读取到缓冲区,因此从BufferedInputStream
读取后,您将获得-1。
看看BufferedInputStream
源代码:http://www.docjar.com/html/api/java/io/BufferedInputStream.java.html