缓冲输入流标记读取限制

时间:2011-12-22 03:36:39

标签: java inputstream

我正在学习如何使用InputStream。我试图为BufferedInputStream使用mark,但是当我尝试重置时,我有以下例外:

java.io.IOException: Resetting to invalid mark

我认为这意味着我的标记读取限制设置错误。我实际上不知道如何在mark()中设置读取限制。我试过这样:

is = new BufferedInputStream(is);
is.mark(is.available());

这也是错误的。

is.mark(16);

这也引发了同样的异常。 我怎么知道我应该设置什么读取限制?因为我将从输入流中读取不同的文件大小。

3 个答案:

答案 0 :(得分:6)

mark有时候非常有用,如果你需要检查超出你读取的几个字节来决定接下来要做什么,然后你重新回到标记并调用期望文件指针的例程在输入的逻辑部分的开头。我认为它不是真的打算用于其他方面。

如果您查看BufferedInputStream的javadoc,则说

  

标记操作会记住输入流中的一个点,并且重置操作会导致在从包含的输入流中获取新字节之前重新读取自最近标记操作以来读取的所有字节。

这里要记住的关键是,一旦你在流中标记一个点,如果你继续读取超过标记的长度,标记将不再有效,并且重置调用将失败。因此,标记适用于特定情况,在其他情况下使用不多。

答案 1 :(得分:1)

这将从同一个BufferedInputStream中读取5次。

for (int i=0; i<5; i++) {
   inputStream.mark(inputStream.available()+1);
   // Read from input stream
   Thumbnails.of(inputStream).forceSize(160, 160).toOutputStream(out);
   inputStream.reset();
}

答案 2 :(得分:0)

您传递给mark()的值是您需要重置的向后量。如果需要重置到流的开头,则需要一个与整个流一样大的缓冲区。这可能不是一个很好的设计,因为它不能很好地扩展到大流。如果您需要两次读取流并且您不知道数据的来源(例如,如果它是一个文件,您可以重新打开它),那么您应该将其复制到临时文件中,这样您就可以随意阅读。