您的位置:首页 > Web前端

BufferedInputStream中的mark()和reset()用法,及其中readlimit相关的问题

2018-03-01 17:52 711 查看

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源码分析
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  io