bytearrayinputstream的skip方法通过移动内部pos指针实现快速跳过,不拷贝数据、不触发i/o;需检查返回值是否小于请求值,跳过后read从新pos开始;mark/reset不受影响。

ByteArrayInputStream 的 skip 方法本质是移动内部指针,不真正“跳过”数据,所以非常快。
skip 方法的底层原理
ByteArrayInputStream 内部维护一个 pos(当前读取位置)和 count(总字节数)。调用 skip(n) 只是将 pos 增加 n,只要不超过 count,就直接返回 n —— 没有内存拷贝、不触发 I/O、也不解析内容。
正确使用 skip 的关键点
- 返回值可能小于请求跳过的字节数:当剩余可读字节数不足时(
pos + n > count),实际跳过的是count - pos - 必须检查返回值,不能假设一定跳过了指定数量
- 跳过之后,后续
read()或read(byte[])会从新pos开始读,中间字节被逻辑忽略
实用示例:跳过固定头部
比如处理一个协议头为 4 字节长度字段的二进制流:
byte[] data = {0, 0, 0, 4, 'h', 'e', 'l', 'l', 'o'}; // 前4字节是长度,后面是内容
ByteArrayInputStream bis = new ByteArrayInputStream(data);
<p>bis.skip(4); // 快速跳过头部,pos 从 0 → 4
byte[] payload = new byte[5];
bis.read(payload); // 读到 "hello"
</p>
注意边界与重置
skip 不会改变底层字节数组,也不影响 mark/reset 机制。如果之前调用了 mark(100),跳过后再 reset() 仍能回到 mark 位置。但若跳过超过 available() 返回的值,说明已到流末尾,再 skip 将返回 0。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











