FileInputStream用于读取文件字节数据,核心是创建流、按需读取(单字节或字节数组)、关闭流;适合二进制文件处理;推荐用try-with-resources批量读取以提升性能并确保资源释放。

Java 中使用 FileInputStream 读取文件字节数据,核心是创建输入流、按需读取字节(或字节数组),最后记得关闭流。它适合处理二进制文件(如图片、音频)或需要底层字节控制的场景。
基本用法:单字节读取(适合小文件或学习理解)
调用 read() 方法每次读取一个字节,返回 int 值(0–255),读到文件末尾返回 -1。注意不能直接赋给 byte 变量,避免符号扩展问题。
示例:
try (FileInputStream fis = new FileInputStream("data.bin")) {
int b;
while ((b = fis.read()) != -1) {
System.out.print((byte) b + " "); // 转回 byte 输出
}
} catch (IOException e) {
e.printStackTrace();
}
推荐方式:批量读取字节数组(高效、实用)
使用 read(byte[] b) 一次性读入缓冲区,减少系统调用次数,性能更好。返回实际读取的字节数(可能小于数组长度),需根据该值处理有效数据。
立即学习“Java免费学习笔记(深入)”;
建议缓冲区大小设为 1024 或 8192(常见经验值):
byte[] buffer = new byte[1024];
try (FileInputStream fis = new FileInputStream("photo.jpg")) {
int len;
while ((len = fis.read(buffer)) != -1) {
// 处理 buffer[0] 到 buffer[len-1] 的有效字节
processBytes(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
关键注意事项
-
必须关闭流:不关会导致文件句柄泄漏。优先用 try-with-resources(如上例),自动关闭;若手动管理,务必在
finally块中调用close() -
路径与编码无关:
FileInputStream只读原始字节,不涉及字符编码——读文本时若需字符串,应配合InputStreamReader使用 -
异常处理:构造方法和
read()都抛出IOException,不可忽略 -
文件不存在或无权限:会抛出
FileNotFoundException(是IOException子类),可单独捕获或统一处理
替代方案提示
如果只是想把整个文件一次性读成字节数组,Java 7+ 推荐更简洁的 Files.readAllBytes(Paths.get(...));若需逐行读文本,用 BufferedReader 更合适。但涉及底层字节操作、流式处理大文件或兼容旧代码时,FileInputStream 仍是可靠选择。


















