### Java IO系统详解
#### 一、Java IO概述
Java IO(输入/输出)系统是Java平台中的一个重要组成部分,主要用于处理文件读写、网络通信等数据传输操作。Java IO库提供了一系列类和接口来实现这些功能,使得开发人员能够方便地进行数据的输入和输出操作。
#### 二、Java IO体系结构
Java IO系统的类库主要分为两大块:字节流和字符流。
1. **字节流**:基于8位字节的数据流。
- `InputStream`:所有字节输入流的超类。
- `OutputStream`:所有字节输出流的超类。
2. **字符流**:基于16位Unicode字符的数据流。
- `Reader`:所有字符输入流的超类。
- `Writer`:所有字符输出流的超类。
#### 三、基本概念与操作
##### 3.1 文件操作
- **创建文件**:
```java
File file = new File("文件路径");
boolean success = file.createNewFile();
```
- **读取文件**:
```java
FileInputStream fis = new FileInputStream(file);
int data = fis.read();
while (data != -1) {
System.out.print((char) data);
data = fis.read();
}
fis.close();
```
- **写入文件**:
```java
FileOutputStream fos = new FileOutputStream(file, true); // 追加模式
fos.write('A');
fos.close();
```
- **文件拷贝**:
```java
FileInputStream fis = new FileInputStream(sourceFile);
FileOutputStream fos = new FileOutputStream(destFile);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
fis.close();
fos.close();
```
- **文件夹拷贝**:
```java
File sourceDir = new File("源文件夹路径");
File destDir = new File("目标文件夹路径");
if (!destDir.exists()) {
destDir.mkdirs();
}
String[] files = sourceDir.list();
for (String file : files) {
File srcFile = new File(sourceDir, file);
File destFile = new File(destDir, file);
if (srcFile.isDirectory()) {
copyFolder(srcFile, destFile);
} else {
copyFile(srcFile, destFile);
}
}
```
##### 3.2 字符流与字节流
- **字节流与字符流的区别**:字节流处理的是字节数据,适用于所有类型的数据;字符流处理的是字符数据,适用于文本数据,可以指定字符集。
- **如何选择**:对于纯文本文件,建议使用字符流(`FileReader`和`FileWriter`),而对于二进制文件如图片、音频等,则使用字节流(`FileInputStream`和`FileOutputStream`)更为合适。
- **示例**:
```java
// 使用字符流读取文本文件
FileReader reader = new FileReader(new File("text.txt"));
BufferedReader br = new BufferedReader(reader);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
reader.close();
```
##### 3.3 缓冲流
- **缓冲流的作用**:通过增加一个缓冲区来提高读写效率。
- **实现方式**:
```java
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
byte[] buffer = new byte[1024];
int length;
while ((length = bis.read(buffer)) > 0) {
// 处理数据
}
bis.close();
fis.close();
```
##### 3.4 字节流与字符流的转换
- **从字节流到字符流**:
```java
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); // 指定字符集
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
isr.close();
fis.close();
```
- **从字符流到字节流**:
```java
String content = "Hello, world!";
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
osw.write(content);
osw.flush();
osw.close();
```
##### 3.5 数据序列化与反序列化
- **序列化**:将对象状态转换为可存储或传输的形式的过程。
- **反序列化**:将序列化的数据恢复为对象的过程。
- **示例**:
```java
// 序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.dat"));
oos.writeObject(myObject);
oos.close();
// 反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.dat"));
Object obj = ois.readObject();
ois.close();
```
##### 3.6 自定义Close方法
- **关闭资源**:在实际开发中,经常需要关闭多个资源,可以自定义一个Close类来简化这一过程。
- **示例**:
```java
public class Close {
public static void close(Closeable closeable) {
try {
if (closeable != null) {
closeable.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 使用
Close.close(fis);
Close.close(fos);
```
##### 3.7 PrintStream
- **PrintStream类**:`PrintStream`是`OutputStream`的一个子类,用于简化输出操作。
- **示例**:
```java
PrintStream ps = new PrintStream(System.out);
ps.println("Hello, world!");
ps.close();
```
通过以上内容,我们不仅了解了Java IO的基本概念和用法,还学习了一些高级特性,如缓冲流、字符流和字节流之间的转换以及数据的序列化和反序列化。这些知识对于日常的Java开发工作来说非常重要。