java API文档中表述 mark(int readlimit)标记InputStream的当前位置,并保证mark以后最多可以读取readlimit个字节,这个mark仍然有效。
但是,值得注意的是:mark标记是否有效,不但和readlimit参数有关,还和缓冲区大小有关,最根本的还是缓冲区大小有关!
example 1:
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
public class MarkDemo {
public static void main(String[] args) {
byte[] bytes = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
// 将ByteArrayInputStream包含在一个BufferedInputStream,并初始化缓冲区大小为2。
BufferedInputStream bi = new BufferedInputStream(in, 2);
try {
// 读取字节1
System.out.print(bi.read() + ",");
// 在字节2处做标记,同时设置readlimit参数为1
System.out.println("mark");
bi.mark(1);
System.out.println("readlimit is 1 ");
// 连续读取两个字节
System.out.print(bi.read() + ",");
System.out.print(bi.read() + ",");
// 调用reset方法,未发生异常,说明mark标记仍有效。
// 因为,虽然readlimit参数为1,但是这个BufferedInputStream类的缓冲区大小为2,
// 所以允许读取2字节
System.out.println("reset");
bi.reset();
/*
*
* 连续读取3个字节,超过了缓冲区大小,mark标记失效。
*
* 在这个例子中BufferedInputStream类的缓冲区大小大于readlimit,
*
* mark标记由缓冲区大小决定
*/
// reset重置后连续读取3个字节,超过了BufferedInputStream类的缓冲区大小
System.out.print(bi.read() + ",");
System.out.print(bi.read() + ",");
System.out.print(bi.read() + ",");
// 再次调用reset重置,抛出异常,说明mark后读取3个字节,mark标记失效
System.out.println("reset again");
bi.reset();
} catch (IOException e) {
e.printStackTrace();
}
}
}
example 2:
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
public class MarkDemo {
public static void main(String[] args) {
byte[] bytes = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
// 将ByteArrayInputStream包含在一个BufferedInputStream,并初始化缓冲区大小为2。
BufferedInputStream bi = new BufferedInputStream(in, 2);
// 原来的缓冲区为2,现在readlimit设置为3,那么系统就分配足够大的缓冲区(相对于readlimit)来保证mark
/*
* 连续read()三次,但是仍在readlimit这个参数范围内,方法reset()仍有效
*/
try {
System.out.println("readlimit is 3");
bi.mark(3);
System.out.print(bi.read() + ",");
System.out.print(bi.read() + ",");
System.out.print(bi.read() + ",");
// 再次调用reset重置,未抛出异常,说明mark后读取3个字节,mark标记仍有效
System.out.println("reset again");
bi.reset();
/*
* 连续read()四次,超过了readlimit参数的范围(其实最根本的是超出了分配的缓冲区)
* mark标记失效,调用reset方法,抛出异常
*/
System.out.print(bi.read() + ",");
System.out.print(bi.read() + ",");
System.out.print(bi.read() + ",");
// 再次调用reset重置,未抛出异常,说明mark后读取3个字节,mark标记仍有效
System.out.println("reset again");
bi.reset();
} catch (IOException e) {
e.printStackTrace();
}
}
}