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经过的路径就是输出数组中对应的值
对应代码
MarkExamplepackage 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源码分析
相关文章推荐
- BufferedInputStream源码分析,解答readlimit相关的问题
- sscanf,sscanf_s及其相关用法
- sscanf,sscanf_s及其相关用法
- 转载:SDN论坛看到的BW问题及其相关解答
- Servlet 相关问题及其解答
- 应聘Java笔试时可能出现问题及其答案 (其他相关)
- map及其相关函数的用法
- mount 加载window分区及其相关问题解决方案
- 链表环及其相关问题
- Ubuntu Feisty(7.04)中与acroread相关的问题
- scanf sscanf,sscanf_s及其相关用法
- 编程回忆之运维回忆(在win7中配置iis及其相关问题解决)
- 网络组建中的相关步骤及其问题排错
- map及其相关函数的用法
- ByteBuffer的mark、position、limit、flip、reset,get方法介绍ok
- sscanf,sscanf_s及其相关用法
- JAVA中mark()和reset()用法
- 无序数组及其子序列的相关问题研究
- XOOPS中的Criteria类及其相关类的用法[转自东至]
- java网络图片抓取及其引发的相关问题