fileinputstream按字节读取文件,核心是read()方法:单字节读取返回0–255的int值,-1表示eof;推荐用byte[]缓冲区批量读取并依返回值处理;必须用try-with-resources自动关闭流;中文需指定编码解码,否则乱码。

FileInputStream 按字节读取文件,核心就是调用 read() 方法——每次读一个字节,返回 int 类型值(0–255),读到末尾返回 -1。
单字节逐个读取(适合小文件或教学理解)
最基础的方式:循环调用 read(),每次获取一个字节,转成 char 或直接处理。
- 注意返回值是
int,不是byte,避免负数问题(比如 -1 表示 EOF) - 读到 -1 就必须停止,否则会无限循环
- 字符编码不处理,纯二进制读取;若含中文,直接转 char 可能乱码(需配合 Charset 解码)
用 byte[] 缓冲区批量读取(推荐,效率高)
调用 read(byte[] b) 或 read(byte[] b, int off, int len),一次读多个字节到数组中,返回实际读取的字节数。
- 缓冲区大小常用 8192(8KB),兼顾内存与性能
- 返回值可能小于数组长度(比如最后一批不足)——务必用返回值控制写入/处理范围
- 避免用
new String(b)直接转字符串,应传入编码如new String(b, 0, len, "UTF-8")
配合 try-with-resources 自动关闭流
FileInputStream 是资源型对象,必须关闭。用 try-with-resources 最安全,不用手动写 finally。
- 声明在 try() 中,JVM 保证异常与否都会调用
close() - 不要在 try 块里 return 后再 close —— 资源已自动释放,重复 close 会抛异常
- 如果需要处理 IOException,可在 catch 中捕获并响应(如打印日志、提示用户)
读取时常见注意事项
看似简单,但几个细节容易出错:
- 路径错误(相对路径以项目根目录为准,建议用绝对路径或
Paths.get(...).toFile()构造) - 文件不存在或无读权限 → 抛出
FileNotFoundException - 读取过程中磁盘被占用或损坏 → 可能抛
IOException - 文本文件用字节流读,中文默认按 ISO-8859-1 解释,显示为乱码——这不是读错了,是解码方式不对
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











