sar*_*mar 6 java stream bufferedinputstream
我是Java流的新手,我想读取特定的文件内容,然后需要从头开始读取。我创建了一个 BufferedInputStream,但我对 BufferedInputStream.mark(int markLimit) 的文档感到困惑
文档说:
public void mark(int readlimit)
Run Code Online (Sandbox Code Playgroud)
此方法在输入中标记一个位置,可以通过调用 reset() 方法将流“重置”到该位置。参数readlimit是设置标记后在标记失效之前可以从流中读取的字节数。例如,如果调用 mark() 时的读取限制为 10,那么当调用 reset() 方法之前从流中读取了 11 个字节的数据时,则该标记无效,并且不需要流对象实例记住标记。
请注意,此方法可以记住的字节数可以大于内部读取缓冲区的大小。它也不依赖于支持标记/重置功能的从属流。
覆盖: FilterInputStream 类中的标记
参数: readlimit - 标记失效之前可以读取的字节数**
我的代码是:
public class Test {
public static void main(String[] args) throws IOException {
File resource = new File("beforeFix.txt");
FileInputStream fileInputStream = new FileInputStream(resource);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
int i = bufferedInputStream.read();
bufferedInputStream.mark(1);
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
bufferedInputStream.reset();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
i = bufferedInputStream.read();
bufferedInputStream.reset();
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我已将 marklimit 设置为 1,但根据文档,标记不会变为无效。
谁能用一个小例子清楚地向我解释一下设置这个的实际目的是什么?
提前致谢
为了重置工作并返回到您标记的位置,标记后读取的数据需要缓冲在内存中。标记时指定的值是应为此保留的内存量。
因此,如果您打算在调用重置之前读取 100 个字节,那么您的缓冲区需要至少为 100 个字节,这就是您调用标记时必须使用的内容。
bufferedInputStream.mark(200);
... read no more than 200 bytes ...
bufferedInputStream.reset(); // reset back to marked position
Run Code Online (Sandbox Code Playgroud)
更新
看起来文档与mark实际行为不匹配。文档指出:
the maximum limit of bytes that can be read before the mark position becomes invalid
Run Code Online (Sandbox Code Playgroud)
然而,看起来应该是这样the minimum limit,或者至少底层实现不需要在超出读取限制后立即丢弃标记,如果它们仍然可以支持重置到标记位置。
| 归档时间: |
|
| 查看次数: |
7986 次 |
| 最近记录: |