Java缓冲输入流里 mark() 和 reset() 用法

根据 Java 官方文档的描述,mark(int readlimit) 方法表示,标记当前位置,并保证在 mark 之后最多能够读取 readlimit 字节数据,mark 标记仍有效。若是在 mark 后读取超过 readlimit 字节数据,mark 标记就会失效,调用 reset() 方法会有异常。code

但实际的运行状况却和 Java 文档中的描述并不彻底相符。 有时候在 BufferedInputStream 类中调用 mark(int readlimit) 方法后,即便读取超过 readlimit 字节的数据,mark 标记仍有效,仍然能正确调用 reset 方法重置。文档

事实上,mark 在 Java 中的实现是和缓冲区相关的。只要缓冲区够大,mark 后读取的数据没有超出缓冲区的大小,mark 标记就不会失效。若是不够大,mark 后又读取了大量的数据,致使缓冲区更新,原来标记的位置天然找不到了。源码

所以,mark 后读取多少字节才失效,并不彻底由 readlimit 参数肯定,也和 BufferedInputStream 类的缓冲区大小有关。 若是 BufferedInputStream 类的缓冲区大小大于readlimit,在 mark 之后只有读取超过缓冲区大小的数据,mark 标记才会失效。it

不懂的看源码,以 BufferedInputStream 为例,看下此流类型的两个成员变量:变量

private static int DEFAULT_BUFFER_SIZE = 8192;
private static int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8;

因此,通常缓冲区足够你用了,一般 mark() 后,reset() 不会抛出异常,可是,在未调用 mark() 前,调用 reset() 会抛异常!缘由仍是本身查源码^_^!方法

相关文章
相关标签/搜索