我正在尝试构建一个简单的解析器,并且由于 InputStream 没有类似 peek 的方法,因此我正在使用标记和重置。 但我怀疑连续的标记调用会使之前的调用无效。是这样吗? 是否可以做类似的事情
foo.mark(1);
...
foo.mark(2);
...
foo.reset();
...
foo.reset();
如果没有,是否有其他方法来模拟这个或 peek 方法?
谢谢。
您的怀疑是正确的,如果您读取的字节数少于 readlimit
字节,则
InputStream.mark(int readlimit)方法将允许您仅将流重新定位到最后标记的位置。如果您想要一个“可查看”的输入流,您可能需要考虑PushbackInputStream。它没有明确提供查看功能,但它允许您“推回”已读取的字节。
标记不能嵌套。
如果您想多次重新读取流,您可能需要将流(的一部分)复制到字节数组中,并制作它的
ByteArrayInputStream
。您仍然不能有多个标记,但可以有多个 ByteArrayInputStream
。 (或者忘记 ByteArrayInputStream
并直接从数组中选取字节。)
对于那些有兴趣在 InputStream 上执行多个嵌套标记/重置操作的人,我很高兴向您展示特殊的实现。 在这里你可以找到基于常规 BufferedInputStream 的Multiple Marks InputStream。至少可以与 OpenJDK 8 中的 BIS 配合使用。作为一项附加功能,它支持与标记/重置相关的流字节计数。