Java IO 流中怎么通过 InputStream 的 available 方法预判可读字节数

舞夢輝影

舞夢輝影

2026-08-02

285人浏览

原创

inputstream.available()返回当前可立即读取而不阻塞的字节数,并非流总长度或业务变量大小;其值因流类型而异,常不可靠,应改用动态缓冲或协议驱动的精确读取。

java io 流中怎么通过 inputstream 的 available 方法预判可读字节数

InputStream 的 available() 方法返回的是当前输入流中**可立即读取、无需阻塞的字节数**,但它不是万能的“长度预告”,用法有明确边界和常见误区。

available() 的真实含义和局限

它不表示整个流剩余总字节数,也不代表后续一定能读到这么多——只反映底层实现(如缓冲区、设备驱动)当前“手头已准备好”的字节量。例如:

  • FileInputStream,通常返回剩余未读字节数(较可靠);
  • SocketInputStream 或串口流,返回的是内核接收缓冲区里已到达、尚未被应用读走的字节数(可能随时变化);
  • BufferedInputStream,返回的是内部缓冲区里还剩多少字节可直接取,不包含底层流新到达的数据;
  • 对压缩流(如 GZIPInputStream)或加密流,available() 常返回 0 或不准确值,因为解压/解密过程无法预知输出长度。

适合用 available() 的典型场景

它最适合用于避免无谓阻塞,尤其在低速、交互式或实时性要求高的 I/O 中:

Java JDK 25
Java JDK 25

Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。

下载
  • 串口通信轮询:先调 in.available() > 0,再读,防止 read() 卡住;
  • 非阻塞式数据探测:比如监听控制台或调试端口,有字节才处理,没字节就去做别的事;
  • 配合协议头解析:若协议规定“头4字节为长度”,可先检查 available() >= 4,再安全读头,避免只读到2字节就卡住。

不能依赖 available() 的情况

以下做法容易出错,应避免:

  • available() == 0 判断“流已结束”——这是错误的,流末尾时它也可能返回 0,但不代表 EOF,只是此刻没数据;
  • 用它替代协议层长度字段,比如假设 available() == 100 就直接 read(new byte[100])——网络延迟或分包可能导致后续字节还没到,实际 read 可能只返回几十字节;
  • DataInputStream 上依赖它规避 EOFException——该类方法(如 readInt())仍会因数据不足而抛异常,available() 对其无实质保护作用。

更稳妥的替代思路

比起盲目查 available(),优先按协议设计读取逻辑:

  • 前 N 字节定义长度 → 先确保读满 N 字节(可用循环 + read() 检查返回值),再按长度读 payload;
  • 固定帧结构 → 按帧头、长度、校验、帧尾逐段读,每步都校验返回值是否符合预期;
  • 文件场景 → 若已知文件大小,可用 File.length() 和已读字节数做进度判断,比 available() 更确定。

本质上,available() 是个“快照提示”,不是“承诺”。它有用,但得清楚它说什么、不说什么。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

3889

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

2860

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

2899

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

638

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

602

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

727

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1317

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

18866

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

647

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

Java 26官方文档
Java 26官方文档

共0课时 | 0人学习