Java I/O 核心技术:流、文件操作与标准输入输出
java.io 包提供了全面的 I/O 支持,核心抽象是流——数据的有序序列。流分两大类:
- 输入流:从源读取数据(
InputStream/Reader) - 输出流:向目标写入数据(
OutputStream/Writer)
字节流与字符流
字节流
处理 8 位字节,核心类:FileInputStream、FileOutputStream。适用于图片、音视频等二进制数据。
try (FileInputStream in = new FileInputStream("input.txt");
FileOutputStream out = new FileOutputStream("output.txt")) {
int c;
while ((c = in.read()) != -1) out.write(c);
}
使用 try-with-resources 自动关闭流(Java 7+),避免资源泄漏。
字符流
处理 16 位 Unicode 字符,核心类:FileReader、FileWriter。内部基于字节流但按字符读写,适合文本文件。
try (FileReader in = new FileReader("input.txt");
FileWriter out = new FileWriter("output.txt")) {
int c;
while ((c = in.read()) != -1) out.write(c);
}
标准流
Java 提供三个预定义标准流:
| 流 | 对象 | 典型设备 |
|---|---|---|
| 标准输入 | System.in | 键盘 |
| 标准输出 | System.out | 屏幕 |
| 标准错误 | System.err | 屏幕 |
try (InputStreamReader cin = new InputStreamReader(System.in)) {
System.out.println("输入字符,'q' 退出");
char c;
do { c = (char) cin.read(); System.out.print(c); } while (c != 'q');
}
文件读写核心类
FileInputStream 常用方法
| 方法 | 说明 |
|---|---|
read() | 读取单字节,返回 int,-1 表示末尾 |
read(byte[] b) | 批量读入字节数组,返回读取字节数 |
available() | 返回可读字节数估计值 |
close() | 关闭流,释放资源 |
FileOutputStream 常用方法
| 方法 | 说明 |
|---|---|
write(int b) | 写入单字节 |
write(byte[] b) | 写入字节数组 |
close() | 关闭流 |
综合示例:写入并读回字节
byte[] data = {11, 21, 3, 40, 5};
try (FileOutputStream os = new FileOutputStream("test.txt");
FileInputStream is = new FileInputStream("test.txt")) {
for (byte b : data) os.write(b);
int size = is.available();
for (int i = 0; i < size; i++) System.out.print((char)is.read() + " ");
}
文件与目录操作
java.io.File 类代表文件/目录路径,提供跨平台路径处理。
创建目录
mkdir():创建单级目录,父目录需存在mkdirs():创建多级目录(含父目录)
new File("/tmp/user/java/bin").mkdirs(); // 自动创建完整路径
列出目录内容
File dir = new File("/tmp");
String[] names = dir.list(); // 仅文件/目录名
File[] files = dir.listFiles(); // 获取 File 对象数组,更实用
for (File f : files) System.out.println(f.getName() + (f.isDirectory() ? "/": ""));
最佳实践建议
- 优先使用
try-with-resources管理流生命周期 - 大文件复制使用缓冲流(
BufferedInputStream/BufferedOutputStream)或 NIOFiles.copy()提升性能 - 文本处理优先用字符流(
BufferedReader/BufferedWriter) - 指定字符集(如 UTF-8)避免乱码:
new FileReader(file, StandardCharsets.UTF_8)(Java 11+)
java
- C 语言输入输出(I/O)精通:scanf() 与 printf() 详解
- Python 文件 I/O:掌握文件操作、读写与管理
- Java 变量与字面量:全面指南
- 精通 Java 输入输出:打印、读取与格式化数据
- Java 类与对象:实用指南
- Java 抽象类与抽象方法完全指南
- 精通 Java 嵌套类与内部类:类型、示例与最佳实践
- Java throw 与 throws 深度解析:异常处理实战指南
- 掌握 Java Scanner:读取文本、数字与复杂类型的综合指南
- 掌握 Java 自动装箱与拆箱:实战示例与最佳实践
- 精通 Java:理解对象、类与核心 OOP 概念
- 掌握 Java 日期时间:构造器、方法与最佳实践