Java IO概述 #
一、IO概述 #
Java IO(Input/Output)是Java提供的用于处理输入输出的API。
1.1 IO分类 #
- 按流向:输入流、输出流
- 按类型:字节流、字符流
- 按功能:节点流、处理流
1.2 IO体系 #
text
字节流
├── InputStream(输入)
│ ├── FileInputStream
│ ├── ByteArrayInputStream
│ ├── BufferedInputStream
│ └── DataInputStream
└── OutputStream(输出)
├── FileOutputStream
├── ByteArrayOutputStream
├── BufferedOutputStream
└── DataOutputStream
字符流
├── Reader(输入)
│ ├── FileReader
│ ├── StringReader
│ ├── BufferedReader
│ └── InputStreamReader
└── Writer(输出)
├── FileWriter
├── StringWriter
├── BufferedWriter
└── OutputStreamWriter
二、字节流vs字符流 #
2.1 区别 #
| 特性 | 字节流 | 字符流 |
|---|---|---|
| 处理单位 | 字节(8位) | 字符(16位) |
| 基类 | InputStream/OutputStream | Reader/Writer |
| 适用场景 | 二进制文件 | 文本文件 |
| 编码 | 不处理编码 | 自动处理编码 |
2.2 选择建议 #
java
// 文本文件:使用字符流
Reader reader = new FileReader("test.txt");
Writer writer = new FileWriter("output.txt");
// 二进制文件:使用字节流
InputStream is = new FileInputStream("image.png");
OutputStream os = new FileOutputStream("copy.png");
三、节点流与处理流 #
3.1 节点流 #
直接操作数据源的流。
java
// 文件节点流
FileInputStream fis = new FileInputStream("test.txt");
FileOutputStream fos = new FileOutputStream("output.txt");
// 数组节点流
ByteArrayInputStream bais = new ByteArrayInputStream(data);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
3.2 处理流 #
包装节点流,提供增强功能。
java
// 缓冲流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"));
// 转换流
InputStreamReader isr = new InputStreamReader(new FileInputStream("test.txt"), "UTF-8");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("output.txt"), "UTF-8");
四、流的关闭 #
4.1 手动关闭 #
java
FileInputStream fis = null;
try {
fis = new FileInputStream("test.txt");
// 读取操作
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.2 try-with-resources #
java
try (FileInputStream fis = new FileInputStream("test.txt");
FileOutputStream fos = new FileOutputStream("output.txt")) {
// 读写操作
} catch (IOException e) {
e.printStackTrace();
}
五、File类 #
5.1 创建File对象 #
java
File file1 = new File("test.txt");
File file2 = new File("/path/to/file.txt");
File file3 = new File("/path", "file.txt");
5.2 常用方法 #
java
File file = new File("test.txt");
// 文件信息
file.getName(); // 文件名
file.getPath(); // 路径
file.getAbsolutePath(); // 绝对路径
file.getParent(); // 父目录
file.length(); // 文件大小
// 判断
file.exists(); // 是否存在
file.isFile(); // 是否是文件
file.isDirectory(); // 是否是目录
file.canRead(); // 是否可读
file.canWrite(); // 是否可写
// 操作
file.createNewFile(); // 创建文件
file.delete(); // 删除文件
file.mkdir(); // 创建目录
file.mkdirs(); // 创建多级目录
file.renameTo(new File("new.txt")); // 重命名
// 目录操作
String[] list = file.list(); // 列出文件名
File[] files = file.listFiles(); // 列出File对象
六、IO设计模式 #
6.1 装饰器模式 #
java
// 节点流被处理流装饰
InputStream is = new FileInputStream("test.txt");
InputStream bis = new BufferedInputStream(is);
InputStream dis = new DataInputStream(bis);
6.2 适配器模式 #
java
// 字节流转字符流
InputStream is = new FileInputStream("test.txt");
Reader reader = new InputStreamReader(is, "UTF-8");
七、总结 #
| 类型 | 输入 | 输出 |
|---|---|---|
| 字节流 | InputStream | OutputStream |
| 字符流 | Reader | Writer |
IO要点:
- 字节流处理二进制,字符流处理文本
- 使用处理流增强功能
- 使用try-with-resources自动关闭
- File类操作文件和目录
最后更新:2026-03-26