我可以在Java中对InputStream执行连续的标记操作吗

问题描述 投票:0回答:3

我正在尝试构建一个简单的解析器,并且由于 InputStream 没有类似 peek 的方法,因此我正在使用标记和重置。 但我怀疑连续的标记调用会使之前的调用无效。是这样吗? 是否可以做类似的事情

foo.mark(1);
...
foo.mark(2);
...
foo.reset();
...
foo.reset();

如果没有,是否有其他方法来模拟这个或 peek 方法?

谢谢。

java inputstream reset
3个回答
4
投票

您的怀疑是正确的,如果您读取的字节数少于 readlimit 字节,则

InputStream.mark(int readlimit)
方法将允许您仅将流重新定位到最后标记的位置。如果您想要一个“可查看”的输入流,您可能需要考虑PushbackInputStream。它没有明确提供查看功能,但它允许您“推回”已读取的字节。


1
投票

标记不能嵌套。

如果您想多次重新读取流,您可能需要将流(的一部分)复制到字节数组中,并制作它的

ByteArrayInputStream
。您仍然不能有多个标记,但可以有多个
ByteArrayInputStream
。 (或者忘记
ByteArrayInputStream
并直接从数组中选取字节。)


0
投票

对于那些有兴趣在 InputStream 上执行多个嵌套标记/重置操作的人,我很高兴向您展示特殊的实现。 在这里你可以找到基于常规 BufferedInputStream 的Multiple Marks InputStream。至少可以与 OpenJDK 8 中的 BIS 配合使用。作为一项附加功能,它支持与标记/重置相关的流字节计数。

© www.soinside.com 2019 - 2024. All rights reserved.