输入流无法重置到开头

18
InputStream data = realResponse.getEntity().getContent();
byte[] preview = new byte[100];
data.read(preview, 0, 100);

// 现在我想稍后引用InputStream,但我希望它是从流的开头开始的,而不是从100个字节处开始。我尝试在100个字节处使用 mark()进行标记,然后在读取前100个字节后使用 reset(),但也没有起作用。

有什么想法吗?可能是一个愚蠢的错误...只是没有看到它。

2个回答

26

当您使用java.io.InputStream对象的mark()方法时,您应该使用markSupported()方法检查您的InputStream是否实际支持使用标记。根据API文档,InputStream类不支持,但java.io.BufferedInputStream类支持。也许您应该将流嵌入到BufferedInputStream对象中,例如:

InputStream data = new BufferedInputStream(realResponse.getEntity().getContent());
// data.markSupported() should return "true" now
data.mark(some_size);
// work with "data" now
...
data.reset();

InputStream中的reset()方法除了抛出IOException()之外什么也不做。;-) - Chris Huang-Leaver

1
如果InputStream支持标记(您可以使用markSupported()方法进行检查),那么以下内容应该可以实现:
InputStream data = realResponse.getEntity().getContent();
byte[] preview = new byte[100];
data.mark(100);
data.read(preview, 0, 100);
data.reset();

然而,请注意 data.read(preview, 0, 100) 并不保证一次性读取100个字节,它可能会读取更少。


我无法回答这个问题,除非知道 realResponse 类是什么(以及它所在的库版本)。 - Lucero

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