FileInputStream是Java基础字节输入流,用于文件字节读取;配合FileOutputStream可实现字节级读写,适合二进制文件,不推荐直接处理文本。

FileInputStream 是 Java 中最基础的字节输入流,用于从文件中按字节读取数据;配合 FileOutputStream 可完成文件的字节级读写。它不处理字符编码,适合读写图片、音频、二进制文件等,不适合直接处理文本(文本推荐用字符流如 FileReader)。
一、用 FileInputStream 读取文件
创建对象时传入文件路径或 File 对象,通过 read() 方法逐字节读取,返回 int(0–255),读到末尾返回 -1。注意:效率低,仅适合小文件或教学演示。
- 基本写法(单字节读取):
int b;
while ((b = fis.read()) != -1) {
System.out.print((char)b); // 或写入其他流
}
fis.close();
- 更常用的是带缓冲区的批量读取(推荐):
int len;
while ((len = fis.read(buffer)) != -1) {
System.out.write(buffer, 0, len); // 直接输出字节内容
}
其中 len 表示本次实际读到的字节数,每次不一定填满缓冲区。
二、用 FileOutputStream 写入文件
构造时指定文件路径,默认覆盖原文件;若需追加,用 new FileOutputStream("xxx", true)。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 写单字节:
fos.write(65); // 写入字节 A
fos.close();
- 写字节数组(更实用):
fos.write(data);
fos.close();
注意:getBytes() 不指定编码时依赖系统默认 Charset,跨平台可能出问题,生产环境建议显式指定,如 "Hello".getBytes(StandardCharsets.UTF_8)。
三、必须记得关闭流(资源管理)
流占用系统文件句柄,不关闭可能导致文件被锁定、内存泄漏或“Too many open files”异常。
- 传统方式:用
try-catch-finally确保关闭 - 现代方式(JDK 7+):用 try-with-resources(自动关闭)——强烈推荐
FileOutputStream fos = new FileOutputStream("out.txt")) {
int b;
while ((b = fis.read()) != -1) {
fos.write(b);
}
} catch (IOException e) {
e.printStackTrace();
}
只要实现了 AutoCloseable 接口(FileInputStream 和 FileOutputStream 都满足),就能自动关闭。
四、常见注意事项
- 路径问题:相对路径以项目根目录或 JVM 启动目录为基准,建议用绝对路径或
getClass().getResource()加载类路径资源 - 中文乱码:字节流本身不解析字符,如果强行把字节当文本打印(如
(char)b),且源文件是 UTF-8 编码而控制台是 GBK,就会乱码——这不是流的问题,而是解码环节错配 - 大文件复制:不要用单字节循环,务必用字节数组缓冲读写,否则极慢
- 异常处理:
IOException是检查型异常,必须捕获或声明抛出
掌握字节流是理解 Java I/O 的起点,后续可延伸学习 BufferedInputStream、DataInputStream、NIO 的 Files 工具类等,提升效率和功能。

















