Java 输入输出流(IO):文件字节流与字符流
·
一、前言
在 Java 开发中,文件读写、数据传输都离不开 IO 流(输入输出流)。IO 流是程序与外部设备(文件、网络、键盘等)之间传输数据的通道。
本文重点讲解:
- IO 流的基本概念与分类
- 文件字节流(FileInputStream / FileOutputStream)
- 文件字符流(FileReader / FileWriter)
- 二者区别与使用场景
- 作业高频代码示例
内容通俗易懂,适合课程作业、复习、面试使用。
二、IO 流的基本概念
1. 什么是输入流、输出流
- 输入流(Input):从 外部 → 程序 读取数据
- 输出流(Output):从 程序 → 外部 写出数据
可以简单记: 以程序为中心,进为输入,出为输出。
2. IO 流的两大分类
-
按数据类型
- 字节流:以 字节(byte) 为单位,可读写所有文件(文本、图片、音频、视频等)
- 字符流:以 字符(char) 为单位,只能读写纯文本文件
-
按功能方向
- 输入流
- 输出流
三、文件字节流(万能流)
文件字节流是最通用的流,可以处理任何类型的文件。
1. 核心类
- FileInputStream:文件字节输入流(读文件)
- FileOutputStream:文件字节输出流(写文件)
2. 适用场景
图片、音频、视频、压缩包、文本文件 全都能读写。
3. 文件字节输入流(读取文件)
java
运行
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
// 1. 创建字节输入流
FileInputStream fis = new FileInputStream("test.txt");
// 2. 读取数据(一个字节一个字节读)
int b;
while ((b = fis.read()) != -1) {
System.out.print((char) b);
}
// 3. 关闭流
fis.close();
}
}
4. 文件字节输出流(写入文件)
java
运行
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamDemo {
public static void main(String[] args) throws IOException {
// 第二个参数 true:追加写入,false/不写:覆盖写入
FileOutputStream fos = new FileOutputStream("test.txt", true);
// 写入数据
fos.write("Hello Java IO!\n".getBytes());
fos.write("文件字节流测试".getBytes());
fos.close();
}
}
四、文件字符流(专门读写纯文本)
字符流以字符为单位,专门解决中文乱码问题,只能读写纯文本文件。
1. 核心类
- FileReader:文件字符输入流(读文本)
- FileWriter:文件字符输出流(写文本)
2. 适用场景
只用于:.txt、.java、.md 等纯文本文件。
3. 文件字符输入流
java
运行
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("test.txt");
int ch;
while ((ch = fr.read()) != -1) {
System.out.print((char) ch);
}
fr.close();
}
}
4. 文件字符输出流
java
运行
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
// true 表示追加
FileWriter fw = new FileWriter("test.txt", true);
fw.write("\n我是字符流写入的中文");
fw.write("\n读写中文不会乱码!");
fw.close();
}
}
五、字节流 vs 字符流(作业必背)
1. 区别
表格
| 对比项 | 字节流(Byte Stream) | 字符流(Character Stream) |
|---|---|---|
| 基本单位 | 字节(8 bit) | 字符(char) |
| 操作文件 | 所有类型文件(万能) | 仅纯文本文件 |
| 中文处理 | 可能出现乱码 | 专门处理中文,不乱码 |
| 核心类 | FileInputStream/FileOutputStream | FileReader/FileWriter |
| 是否需要缓冲区 | 建议使用 | 建议使用 |
2. 使用选择
- 读写图片、音频、视频、文件拷贝 → 用字节流
- 读写纯文本、中文 → 用字符流
六、文件拷贝案例(字节流实现)
作业最常考:文件复制代码
java
运行
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {
public static void main(String[] args) throws IOException {
// 1. 创建输入输出流
FileInputStream fis = new FileInputStream("source.jpg");
FileOutputStream fos = new FileOutputStream("copy.jpg");
// 2. 一边读一边写
byte[] buffer = new byte[1024]; // 缓冲区
int len;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
// 3. 关闭流(后开先关)
fos.close();
fis.close();
System.out.println("文件拷贝成功!");
}
}
七、IO 流使用注意事项
- 流使用完毕必须关闭(close ()),否则会造成资源泄漏
- 读写文件时可能产生 IOException,需要捕获或抛出
- 字节流适合所有文件,字符流只适合文本
- 大型文件读写建议使用 缓冲区 提高效率
- 字符流能有效避免中文乱码问题
八、总结
- Java IO 流分为输入流和输出流,以程序为中心。
- 按数据类型分为字节流和字符流。
- 文件字节流:万能流,可读写任何文件。
- 文件字符流:文本专用,读写中文不乱码。
- 字节流核心类:
FileInputStream/FileOutputStream - 字符流核心类:
FileReader/FileWriter - 实际开发:拷贝文件用字节流,读写文本用字符流。
更多推荐

所有评论(0)