mark与reset基本用法
官方文档,虽然没什么用
mark
reset
调用流程
在BufferedInputStream中,有一个定义一个byte数组来存放流,文件等数据(俗称缓冲区数组),如下图所示
- 将文件数据部分读入缓冲区,缓冲区大小为10
- 从缓冲区中取出1,2两个数据
- 调用mark(int readlimit)方法,具体值为:mark(3)
- 继续输出3,4,5,6值
- 调用reset()方法
- 输出剩下的值
PS:其中pos经过的路径就是输出数组中对应的值
对应代码
MarkExample
package other;
import java.io.ByteArrayInputStream;
import java.io.IOException;
public class MarkExample {
public static void main(String[] args) {
try {
// 初始化一个字节数组,内有10个字节的数据
byte[] bytes = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 用一个ByteArrayInputStream来读取这个字节数组
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
// 将ByteArrayInputStream包含在一个BufferedInputStream
BufferedInputStream bis = new BufferedInputStream(in);
// 读取字节1,2
System.out.print(bis.read() + ",");
System.out.print(bis.read() + ",");
// 在此处做标记,同时设置readlimit参数为3
System.out.println("mark");
bis.mark(3);
// 继续输出3,4,5,6值
System.out.print(bis.read() + ",");
System.out.print(bis.read() + ",");
System.out.print(bis.read() + ",");
System.out.print(bis.read() + ",");
// 调用reset()方法
System.out.println("reset");
bis.reset();
// 输出剩下的值
System.out.println("");
int c;
while ( (c = bis.read()) != -1 ) {
System.out.print(c + ",");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出
readlimit问题
文档中描述为
简单理解为,当读取缓冲数组内容超过readlimit标识时,markpos失效
上述代码中,当输出3,4,5,6值,已经越过了readlimit界限,然后调用reset方法,markpos依然生效
具体原因,需要分析BufferedInputStream实现方式
单独开辟专题来说明:BufferedInputStream源码分析