返回:
mark
如果方法 markSupported 返回 true,那么输入流总是在调用 mark 之后记录所有读取的字节,并时刻准备在调用方法 reset时 (无论何时),再次提供这些相同的字节。但是,如果在调用 reset 之前可以从流中读取多于 readlimit 的字节,则不需要该流记录任何数据。
参数:
reset
public void reset() throws IOException
reset 的常规协定是:
抛出:
IOException - 如果未标记此流或该标记失效。
java API文档中表述
但是,值得注意的是:mark标记是否有效,不但和readlimit参数有关,还和缓冲区大小有关,最根本的还是缓冲区大小有关!
public static void main(String[] args) throws Exception {
byte[] bytes = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
// 将ByteArrayInputStream包含在一个BufferedInputStream,并初始化缓冲区大小为2。
BufferedInputStream bis = new BufferedInputStream(in, 2);
try {
// 读取字节1
System.out.print(bis.read() + ",");
// 在字节2处做标记,同时设置readlimit参数为1
System.out.println("mark");
bis.mark(1);
System.out.println("readlimit is 1");
// 连续读取两个字节
System.out.print(bis.read() + ",");
System.out.print(bis.read() + ",");
// 虽然readlimit参数为1,但是这个BufferedInputStream类的缓冲区大小为2,
// 所以允许读取2字节
System.out.println("reset");
// 调用reset方法,未发生异常,说明mark标记仍有效。
bis.reset();
//bis.mark(3); //去掉该行注释,下面的代码正常执行
// reset重置后连续读取3个字节,超过了BufferedInputStream类的缓冲区大小
System.out.print(bis.read() + ",");
System.out.print(bis.read() + ",");
System.out.print(bis.read() + ",");
// 再次调用reset重置,抛出异常,说明mark后读取3个字节,mark标记失效
System.out.println("reset again");
bis.reset();
System.out.println("reset successful");
} catch (IOException e) {
e.printStackTrace();
}
}