bufferedinputstream 中标记读取限制有什么用

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,但根据文档,标记不会变为无效。

谁能用一个小例子清楚地向我解释一下设置这个的实际目的是什么?

提前致谢

joh*_*384 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,或者至少底层实现不需要在超出读取限制后立即丢弃标记,如果它们仍然可以支持重置到标记位置。