InputStream的skip()方法尝试跳过指定字节数,返回实际跳过的字节数(可能小于请求值),需循环调用确保跳过目标数量;BufferedInputStream会优先在缓冲区跳过,否则触发底层读取;对文件随机访问应优先使用RandomAccessFile的seek()。

在 Java 中,InputStream 提供了 skip(long n) 方法,用于跳过输入流中指定数量的字节。
skip() 方法的基本用法
调用 skip(n) 会尝试跳过流中的前 n 个字节,返回**实际跳过的字节数**(可能小于 n,比如流末尾不足、被中断或底层不支持高效跳过)。
- 返回值为
long类型,需注意检查是否达到预期 - 该方法不保证一定跳过全部
n字节,尤其是网络流、压缩流等非文件流 - 对于
FileInputStream,通常能高效跳过;而BufferedInputStream会先尝试内部缓冲区跳过,再委托给底层流
安全跳过指定字节数的推荐写法
由于 skip() 可能未跳完,应循环调用直到累计跳过目标数量或流结束:
long toSkip = 1024;
long skipped = 0;
while (skipped < toSkip) {
long result = inputStream.skip(toSkip - skipped);
if (result == 0) {
// 已到流末尾或无法继续跳过(如阻塞中无数据)
break;
}
skipped += result;
}也可封装成工具方法,避免重复逻辑。
立即学习“Java免费学习笔记(深入)”;
注意 BufferedInputStream 的缓冲影响
如果流被 BufferedInputStream 包装,且待跳过的字节仍在缓冲区内,skip() 会直接移动缓冲区指针,非常快;否则会触发底层读取并丢弃数据。这意味着:
- 跳过操作仍会消耗资源(如触发磁盘 I/O 或网络读取)
- 跳过后,后续
read()读取的是跳过位置之后的数据
替代方案:使用 RandomAccessFile(仅限文件)
若操作的是普通文件且需要频繁定位,RandomAccessFile 更合适:
- 通过
seek(long pos)直接移动文件指针,精确、高效、可逆 - 适用于已知偏移量的随机访问场景,但不适用于标准流(如网络响应、管道等)


















