InputStream是Java字节输入流抽象基类,用于读取原始二进制数据;核心方法read()逐字节读取,read(byte[])批量读取,需循环调用直至返回-1;使用时须try-with-resources关闭,并避免直接转字符串以防乱码。

InputStream 是 Java 中所有字节输入流的抽象基类,专用于读取原始二进制数据(即 byte 序列),不涉及字符编码或文本解析。
核心方法:read() 与 read(byte[])
读取二进制数据主要靠两个重载方法:
-
int read():每次读取 1 个字节,返回0~255的整数值;读到流末尾返回-1。适合小量、逐字节处理(如解析协议头)。 -
int read(byte[] b):尝试将最多b.length个字节读入数组b,返回实际读取的字节数(可能小于数组长度);到达末尾时返回-1。这是最常用、高效的方式。 - 还有带偏移和长度的
read(byte[] b, int off, int len),用于向数组指定位置写入,避免额外拷贝。
正确读取完整数据的常见模式
单次 read(byte[]) 不保证填满整个数组,必须循环调用直到返回 -1。典型写法如下:
InputStream is = ...;
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
byte[] buf = new byte[8192]; // 推荐 4KB–64KB 缓冲区
int n;
while ((n = is.read(buf)) != -1) {
buffer.write(buf, 0, n); // 写入实际读到的 n 字节
}
byte[] data = buffer.toByteArray(); // 得到完整原始字节
注意:不能直接用 is.read(buf) == buf.length 判断是否读完,因为网络流或文件末尾可能只读到部分字节。
立即学习“Java免费学习笔记(深入)”;
读取后如何使用原始字节
得到 byte[] 后,可根据需要进一步处理:
- 保存为文件:
Files.write(Paths.get("out.bin"), data) - 解析结构化二进制(如图片头、自定义协议):用
ByteBuffer.wrap(data)配合getShort()、getInt()等方法按字节序提取字段 - 计算哈希或校验和:传给
MessageDigest.update(data) - 解密/压缩:作为
CipherInputStream或GZIPInputStream的输入
注意事项
InputStream 本身不自动关闭,务必配合 try-with-resources 使用:
try (InputStream is = new FileInputStream("data.bin")) {
// 读取逻辑
} // 自动调用 is.close()
不要把 InputStream 当作字符串流使用——若需转字符串,必须显式指定字符集,例如 new String(data, StandardCharsets.UTF_8),否则会用平台默认编码,导致乱码。


















