Java 从流中获取副本而不使用原始流

Java 从流中获取副本而不使用原始流,java,Java,我正在尝试从流中获取内容的副本,而不使用它。我的计划是在后面的代码中使用这个原始流。下面是我试图检查的示例代码。我的目的是保留原始InputStream,以便在获得副本后供将来使用 import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamRead

我正在尝试从流中获取内容的副本,而不使用它。我的计划是在后面的代码中使用这个原始流。下面是我试图检查的示例代码。我的目的是保留原始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();
    }
}
}
但是,当我访问原始流时,在处理它之后,我仍然看到原始流被消耗。见下面的输出

copied stream    : test
original stream  : 
有人能指出我的错误吗


谢谢

不幸的是,这是不可能的,因为溪流的性质

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


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

很遗憾,这是不可能的,因为流的性质

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


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

使用
.mark()
之前,然后是
.reset()
。当然它会被消耗掉。你把它吃掉了。这不是问题。您只需再次调用
newfileinputstream()
,即可再次阅读。别忘了把它们都关上。或者从
ByteArrayOutputStream
构建一个
ByteArrayInputStream
。这是否回答了您的问题@JohannesKuhn
FileInputStream.mark()
不受支持。@matt OP说的是
InputStream
s不是Java 8
Stream
sUse
.mark()
之前和之后的
.reset()
。它当然会被使用。你把它吃掉了。这不是问题。您只需再次调用
newfileinputstream()
,即可再次阅读。别忘了把它们都关上。或者从
ByteArrayOutputStream
构建一个
ByteArrayInputStream
。这是否回答了您的问题@JohannesKuhn
FileInputStream.mark()
不受支持。@matt OP说的是
InputStream
s而不是Java 8
Stream
s感谢您花时间回答。不幸的是,无法打开另一个InputStream(上面的代码部分用于插入web服务,InputStream来自对此服务的请求。上面的代码是检查此行为的示例)。对于SO链接,原始流仍然被消耗,因此猜测它对我的情况也不起作用。感谢您花时间回答。不幸的是,无法打开另一个InputStream(上面的代码部分用于插入web服务,InputStream来自对此服务的请求。上面的代码是检查此行为的示例)。对于SO链接,原始流仍然被消耗,所以我猜它对我的情况也不起作用。