在Java中向InputStream的开头和结尾添加字符

19

我有一个InputStream,需要在开头和结尾添加字符,并最终得到另一个InputStream类型的变量。我该如何轻松地完成这个操作?

2个回答

42

您需要一个SequenceInputStream和几个ByteArrayInputStream。您可以使用String.getBytes方法来生成后者的字节。SequenceInputStream已经有些古老了,所以使用起来有点繁琐:

InputStream middle ;
String beginning = "Once upon a time ...\n";
String end = "\n... and they lived happily ever after.";
List<InputStream> streams = Arrays.asList(
    new ByteArrayInputStream(beginning.getBytes()),
    middle,
    new ByteArrayInputStream(end.getBytes()));
InputStream story = new SequenceInputStream(Collections.enumeration(streams));

如果你有许多字符要添加,又不想将它们一次性转换为字节,那么你可以将它们放在StringReader中,然后使用Commons IO中的ReaderInputStream将它们作为字节读取。但是你需要将Commons IO添加到你的项目中才能这样做。具体的代码留给读者练习。


请提供更多细节?感谢提供这些实用的类名。 - pqn
2
如果你阅读这些类的javadoc,那么很明显。构建一个包含开头字节的第一个ByteArrayInputStream(我们称之为head),一个包含结尾字节的第二个ByteArrayInputStream(我们称之为tail),并从head、原始输入流和tail构建一个SequenceInputStream。 - JB Nizet
另外,应该使用 Arrays.asList 而不是 Collections.asList - pqn

0

1 创建一个新的OutputStream,使用Greg建议的字节数组作为支持。
2 将起始字符写入您的新的OutputStream
3 将现有的InputStream复制到您的新的OutputStream
4 将结束字符写入您的新的OutputStream
5 关闭您的新的OutputStream,注意保留支持数组。
6 将支持数组作为一个新的InputStream打开。

如果您在执行这些步骤中遇到问题,请告诉我们。


你如何向InputStream写入字符? - Tom Anderson
-1、在你的新InputStream中写入结束字符。 -> 你不能向InputStream写入字符。 - GBa
糟糕!重启大脑。按照Greg的建议,将数据写入支持字节数组的输出流中。提取后备数组并重新打开为输入流。感谢您的纠正。 - rossum
2
-1,这个最好用代码表示,对于大型流不够高效。 - Fabian Tamp
1
@Fabian 我认为这个问题是作业,因此我提供了帮助,但没有代码。 你的情况可能有所不同。 - rossum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接