在 Java 中,`InputStream` 是 `java.io` 包中的一个抽象类,代表字节输入流

在 Java 中,InputStreamjava.io 包中的一个抽象类,代表字节输入流,用于从源(如文件、网络连接、内存缓冲区等)读取原始字节数据(8位)。它是所有字节输入流的父类,常见子类包括:

  • FileInputStream:从文件读取字节
  • ByteArrayInputStream:从字节数组读取
  • BufferedInputStream:为其他输入流添加缓冲功能,提升读取性能
  • ObjectInputStream:支持反序列化对象(需配合 Serializable
  • System.in:标准输入流(类型为 InputStream,通常被包装为 ScannerBufferedReader 使用)

⚠️ 注意:InputStream 处理的是字节(byte),不直接处理字符(char)或文本编码;若需读取文本(如 UTF-8 字符串),应配合 InputStreamReader(桥接字节流与字符流)和 BufferedReader 使用。

示例:读取文件前10个字节

try (InputStream is = new FileInputStream("data.bin")) {
    int b;
    int count = 0;
    while ((b = is.read()) != -1 && count < 10) {
        System.out.printf("0x%02X ", b); // 以十六进制打印
        count++;
    }
} catch (IOException e) {
    e.printStackTrace();
}

InputStreamReader(如 InputStreamReader)的核心区别在于数据抽象层级与处理单位不同

维度InputStreamReader(字符流)
数据单位字节(byte,8位)字符(char,16位 Unicode 码元)
用途定位通用二进制数据读取(图片、音频、序列化对象、任意字节流)文本数据读取(字符串、源代码、配置文件等人类可读内容)
编码处理❌ 不涉及字符编码;原样读取字节,不理解“文本”含义✅ 显式依赖字符编码(如 UTF-8、GBK),通过 InputStreamReader 将字节按指定编码解码为字符
继承体系属于 java.io 中的字节流体系InputStreamFilterInputStream → …)属于字符流体系ReaderInputStreamReaderBufferedReader → …)
典型使用场景读取 .jpg, .class, ObjectInputStream, 网络原始报文读取 .txt, .json, .xml, 日志文件等需按文本语义解析的内容

📌 关键桥梁:InputStreamReader字节流到字符流的桥接器——它以 InputStream 为源,按指定 Charset(如 StandardCharsets.UTF_8)将字节解码为字符,从而让 Reader 体系能安全处理文本。

✅ 正确用法示例(避免乱码):

// ✅ 推荐:显式指定编码,防止平台默认编码导致问题
try (InputStream is = new FileInputStream("hello.txt");
     Reader reader = new InputStreamReader(is, StandardCharsets.UTF_8);
     BufferedReader br = new BufferedReader(reader)) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
}

❌ 错误示范(隐式使用平台默认编码,高风险):

new InputStreamReader(new FileInputStream("hello.txt")); // ⚠️ 危险!编码不可控

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bol5261

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值