我正在学习如何使用InputStream.我试图为BufferedInputStream使用mark,但是当我尝试重置时,我有以下异常:
java.io.IOException: Resetting to invalid mark
Run Code Online (Sandbox Code Playgroud)
我认为这意味着我的标记读取限制设置错误.我实际上不知道如何在mark()中设置读取限制.我试过这样的:
is = new BufferedInputStream(is);
is.mark(is.available());
Run Code Online (Sandbox Code Playgroud)
这也是错误的.
is.mark(16);
Run Code Online (Sandbox Code Playgroud)
这也引发了同样的异常.我怎么知道我应该设置什么读取限制?因为我将从输入流中读取不同的文件大小.
mark如果您需要检查超出您所读取的内容的几个字节以决定接下来要做什么,那么有时会很有用,然后重置回标记并调用期望文件指针位于该逻辑部分开头的例程.输入.我认为它不是真的打算用于其他方面.
如果你看一下BufferedInputStream的javadoc 它会说
标记操作记住输入流中的一个点,并且重置操作使得从最近的标记操作开始读取的所有字节在从包含的输入流中获取新字节之前被重新读取.
这里要记住的关键是,一旦你在流中标记了一个点,如果你继续读取超过标记的长度,标记将不再有效,并且重置调用将失败.因此,标记适用于特定情况,在其他情况下使用不多.
您传递给的值mark()是您需要重置的向后量。如果需要重置到流的开头,则需要一个与整个流一样大的缓冲区。这可能不是一个很好的设计,因为它不能很好地扩展到大流。如果您需要读取流两次并且您不知道数据的来源(例如,如果它是一个文件,您可以重新打开它),那么您可能应该将其复制到临时文件,以便您可以重新-随意阅读。
| 归档时间: |
|
| 查看次数: |
17858 次 |
| 最近记录: |