Java 从流中获取副本而不使用原始流
我正在尝试从流中获取内容的副本,而不使用它。我的计划是在后面的代码中使用这个原始流。下面是我试图检查的示例代码。我的目的是保留原始InputStream,以便在获得副本后供将来使用Java 从流中获取副本而不使用原始流,java,Java,我正在尝试从流中获取内容的副本,而不使用它。我的计划是在后面的代码中使用这个原始流。下面是我试图检查的示例代码。我的目的是保留原始InputStream,以便在获得副本后供将来使用 import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamRead
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
。这是否回答了您的问题@JohannesKuhnFileInputStream.mark()
不受支持。@matt OP说的是InputStream
s不是Java 8Stream
sUse.mark()
之前和之后的.reset()
。它当然会被使用。你把它吃掉了。这不是问题。您只需再次调用newfileinputstream()
,即可再次阅读。别忘了把它们都关上。或者从ByteArrayOutputStream
构建一个ByteArrayInputStream
。这是否回答了您的问题@JohannesKuhnFileInputStream.mark()
不受支持。@matt OP说的是InputStream
s而不是Java 8Stream
s感谢您花时间回答。不幸的是,无法打开另一个InputStream(上面的代码部分用于插入web服务,InputStream来自对此服务的请求。上面的代码是检查此行为的示例)。对于SO链接,原始流仍然被消耗,因此猜测它对我的情况也不起作用。感谢您花时间回答。不幸的是,无法打开另一个InputStream(上面的代码部分用于插入web服务,InputStream来自对此服务的请求。上面的代码是检查此行为的示例)。对于SO链接,原始流仍然被消耗,所以我猜它对我的情况也不起作用。