从流中获取副本而不消耗原始流

Cha*_*ake 0 java

我试图从流中获取内容的副本而不使用它。我的计划是在后面的代码中使用这个原始流。以下是我尝试检查的示例代码。我的目的是保留原始的InputStream以供将来在获得副本后使用

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;

public class StreamTest {

public static void main(String[] args) {
    try {
        InputStream inputstream = new FileInputStream("resource.txt"); // content of the file is 'test'

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        org.apache.commons.io.IOUtils.copy(inputstream, baos);
        byte[] bytes = baos.toByteArray();
        System.out.println("copied stream    : " + new String(bytes));

        StringBuilder sb = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(inputstream));
        String line;
        while ((line = br.readLine()) != null) {
            sb.append(line + System.lineSeparator());
        }
        System.out.println("original stream  : " + sb.toString());
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}
Run Code Online (Sandbox Code Playgroud)

但是,当我访问原始流时,在处理它之后,我仍然看到原始流被消耗。请参阅下面的输出

copied stream    : test
original stream  : 
Run Code Online (Sandbox Code Playgroud)

有人可以指出我的错误吗

谢谢

Hor*_*rea 5

遗憾的是,由于流的本质,这是不可能的。

为了从流中复制数据,您需要首先提取它。通过提取它,您可以使用该流。

但不用担心,应该有适合您的特定用例的解决方案。也许打开另一个流(如果您知道流的源每次都提供相同的数据 - 就像在文件中一样 - ,您可以在任何需要使用 InputStream 的地方使用Supplier,以便在必要时创建一个新流),或者您可以查看这篇文章以使用相同的数据创建更多流:/sf/answers/414689271/