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 <p>也可封装成工具方法,避免重复逻辑。</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill11083" title="Java调试"><img src="https://img.php.cn/upload/skill/001/246/273/6adaf20dbae7c507.jpg" alt="Java调试" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill11083" title="Java调试" class="overflowclass">Java调试</a> <p class="overflowclass">通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac</p> </div> <a rel="nofollow" href="/xiazai/skill11083" title="Java调试" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div><h3>注意 BufferedInputStream 的缓冲影响</h3><p>如果流被 <code>BufferedInputStream</code> 包装,且待跳过的字节仍在缓冲区内,<code>skip()</code> 会直接移动缓冲区指针,非常快;否则会触发底层读取并丢弃数据。这意味着: </p>
- 跳过操作仍会消耗资源(如触发磁盘 I/O 或网络读取)
- 跳过后,后续
read()读取的是跳过位置之后的数据
替代方案:使用 RandomAccessFile(仅限文件)
若操作的是普通文件且需要频繁定位,RandomAccessFile 更合适:
- 通过
seek(long pos)直接移动文件指针,精确、高效、可逆 - 适用于已知偏移量的随机访问场景,但不适用于标准流(如网络响应、管道等)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










