假设我有一个接受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

10-08 03:14