FileInputStream适合读取二进制文件或需精细控制字节流的场景,但不直接支持字符编码处理;读文本时须手动指定编码(如UTF-8)转字符串,推荐用缓冲区批量读取或Java 9+的readAllBytes(),并始终使用try-with-resources确保资源关闭。

使用 FileInputStream 读取文件内容,核心是把字节从文件中逐块读出,再转换为可理解的数据(如字符串)。它适合读取二进制文件或需要精细控制字节流的场景,但**不直接支持字符编码处理**——如果读文本,需手动指定编码并转成字符串。
基本读取方式:一次读一个字节(简单但低效)
适用于小文件或教学演示,性能差,不推荐用于实际项目:
try (FileInputStream fis = new FileInputStream("data.txt")) {
int b;
while ((b = fis.read()) != -1) {
System.out.print((char) b); // 注意:未处理编码,中文可能乱码
}
} catch (IOException e) {
e.printStackTrace();
}
-
fis.read() 返回一个
int(0–255),读到末尾返回-1 - 直接强转
(char)仅适用于 ASCII 或默认平台编码匹配的场景 - 每次调用都触发系统调用,效率极低
推荐方式:配合 byte[] 缓冲区批量读取
用固定大小的字节数组(如 8192 字节)分批读取,兼顾效率与内存可控性:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
try (FileInputStream fis = new FileInputStream("data.txt")) {
byte[] buffer = new byte[8192];
int len;
while ((len = fis.read(buffer)) != -1) {
String content = new String(buffer, 0, len, StandardCharsets.UTF_8);
System.out.print(content);
}
} catch (IOException e) {
e.printStackTrace();
}
- fis.read(buffer) 返回本次实际读取的字节数,可能小于数组长度
- 必须用
new String(byte[], offset, length, charset)显式指定编码(如 UTF-8) - 缓冲区大小通常设为 4096、8192 或 65536,过大无益,过小增加 I/O 次数
读取全部内容到字节数组(适合小文件)
Java 9+ 提供了更简洁的方式,自动分配合适大小的数组:
立即学习“Java免费学习笔记(深入)”;
try (FileInputStream fis = new FileInputStream("data.txt")) {
byte[] bytes = fis.readAllBytes(); // Java 9+
String content = new String(bytes, StandardCharsets.UTF_8);
System.out.println(content);
} catch (IOException e) {
e.printStackTrace();
}
- readAllBytes() 内部动态扩容,适合已知文件不大(如配置文件、JSON 小数据)
- 仍需手动转字符串并指定编码,避免平台默认编码导致乱码
- 大文件慎用,会一次性加载全部内容到内存
注意事项与常见问题
- 资源必须关闭:务必用 try-with-resources(如示例),否则文件句柄泄露
-
编码不能忽略:文本文件必须明确指定 Charset(如
StandardCharsets.UTF_8),否则依赖系统默认编码,跨平台易出错 -
路径问题:相对路径基于 JVM 启动目录,建议用绝对路径或
Paths.get(...).toFile()构造 -
替代方案考虑:纯文本读取更推荐
Files.readString()(Java 11+)或BufferedReader+Files.newBufferedReader(),它们内置编码处理

















