java中用fileinputstream和fileoutputstream读写二进制文件,核心是按字节处理、不涉及字符编码,适用于图片、音频等非文本文件;读取时推荐缓冲数组批量read,写入时可用write方法,均需异常处理并建议try-with-resources自动关闭。

Java 中用 FileInputStream 和 FileOutputStream 读写二进制文件,核心是按字节处理数据,不经过字符编码转换,适合图片、音频、PDF 等非文本文件。
读取二进制文件:FileInputStream
使用 FileInputStream 逐字节或批量读取文件原始字节。推荐用缓冲数组方式,避免单字节读取效率低。
- 创建流时传入文件路径(
String)或File对象 - 调用
read(byte[] b)一次性读入最多b.length字节,返回实际读取字节数(-1 表示已到末尾) - 必须手动处理返回值,不能直接假设填满整个数组
- 用完后调用
close()释放资源;建议配合 try-with-resources 自动关闭
示例:
try (FileInputStream fis = new FileInputStream("photo.jpg")) {
byte[] buffer = new byte[8192];
int len;
while ((len = fis.read(buffer)) != -1) {
// 处理 buffer[0] 到 buffer[len-1] 这 len 个字节
processBytes(buffer, 0, len);
}
}
写入二进制文件:FileOutputStream
FileOutputStream 将字节数组或单个字节写入文件。默认覆盖原文件,加 true 参数可追加。
- 构造时指定文件路径,第二个 boolean 参数为
true表示追加模式(默认 false,即覆盖) - 用
write(byte[] b)或write(byte[] b, int off, int len)写入指定范围字节 - 写入后建议调用
flush()(对 FileOutputStream 通常非必需,但养成习惯) - 同样推荐 try-with-resources 确保关闭
示例(复制文件):
try (FileInputStream fis = new FileInputStream("input.zip");
FileOutputStream fos = new FileOutputStream("output.zip")) {
byte[] buf = new byte[4096];
int len;
while ((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
}
注意文件路径与异常处理
路径支持相对路径(如 "data/test.bin")或绝对路径(如 "C:\temp\file.dat")。Windows 下反斜杠需转义或用正斜杠。
- 操作失败会抛出
IOException(如文件不存在、无权限、磁盘满),必须捕获或声明抛出 -
FileNotFoundException是IOException的子类,单独捕获可做针对性提示 - 不要忽略异常,至少记录日志或给出明确错误信息
替代方案:NIO.2 更简洁(可选了解)
如果只是简单读写整个文件,Java 7+ 提供 Files.readAllBytes() 和 Files.write(),底层仍用流,但代码更简短:
byte[] data = Files.readAllBytes(Paths.get("source.bin"));
Files.write(Paths.get("target.bin"), data);
注意:这种方式会一次性加载全部内容到内存,不适合超大文件(如几个 GB)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











