前面大家也看到了,java io包中的类非常多,各种各样的字节流和字符流,看得眼花缭乱,用到的时候难免手忙脚乱,不知道用哪个。
现在就找一些常见的应用场景熟悉一下。
1. 文件操作
Java IO 提供了强大的文件读写操作功能,可以用于文件的创建、读取、写入、删除等操作。
读取文件: 使用 FileReader, BufferedReader 等类读取文本文件。
写入文件: 使用 FileWriter, BufferedWriter 等类写入文本文件。
文件复制: 使用 FileInputStream 和 FileOutputStream 进行文件的字节级复制。
示例:
import java.io.*;
public class FileExample {
public static void main(String[] args) {
// 写入文件
try (BufferedWriter writer = new BufferedWriter(new FileWriter("example.txt"))) {
writer.write("Hello, World!");
} catch (IOException e) {
e.printStackTrace();
}
// 读取文件
try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. 网络通信
Java IO 支持网络通信,主要使用 java.net 包中的类,如 Socket 和 ServerSocket,实现客户端与服务器之间的通信。
服务器端: 使用 ServerSocket 监听客户端连接。
客户端: 使用 Socket 连接到服务器。
示例:
import java.io.*;
import java.net.*;
public class NetworkExample {
public static void main(String[] args) {
// 启动服务器
new Thread(() -> {
try (ServerSocket serverSocket = new ServerSocket(12345)) {
System.out.println("服务器已启动,等待客户端连接...");
Socket socket = serverSocket.accept();
System.out.println("客户端已连接");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
String line;
while ((line = in.readLine()) != null) {
System.out.println("收到客户端消息: " + line);
out.println("服务器收到: " + line);
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
// 启动客户端
new Thread(() -> {
try (Socket socket = new Socket("localhost", 12345);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) {
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("服务器响应: " + in.readLine());
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
3. 数据序列化
Java IO 提供了对象序列化机制,可以将对象转换为字节流,并从字节流还原对象。
对象序列化: 使用 ObjectOutputStream 将对象写入文件或网络。
对象反序列化: 使用 ObjectInputStream 从文件或网络读取对象。
示例:
import java.io.*;
class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + '}';
}
}
public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
// 序列化
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
out.writeObject(person);
} catch (IOException e) {
e.printStackTrace();
}
// 反序列化
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person deserializedPerson = (Person) in.readObject();
System.out.println("反序列化后的对象: " + deserializedPerson);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
4. 处理标准输入输出
Java IO 可以处理标准输入(键盘输入)和标准输出(控制台输出),常用于控制台应用程序。
读取标准输入: 使用 System.in 和 BufferedReader 读取用户输入。
写入标准输出: 使用 System.out 打印输出到控制台。
示例:5. 管道通信
Java IO 提供了管道流 (PipedInputStream 和 PipedOutputStream),可以在同一个 JVM 中的不同线程之间进行通信。
示例:
import java.io.*;
public class PipedIOExample {
public static void main(String[] args) throws IOException {
try {
PipedOutputStream out = new PipedOutputStream();
PipedInputStream in = new PipedInputStream(out);
// 生产者线程
new Thread(() -> {
try (PrintWriter writer = new PrintWriter(out)) {
int i = 0;
while(i <100){
writer.println("Hello from producer!" + i);
i++;
}
}
}).start();
// 消费者线程
new Thread(() -> {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(in))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println("消费者收到: " + line);
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上是 Java IO 在文件操作、网络通信、数据序列化、标准输入输出和管道通信等场景中的常见应用示例。
虽然有更牛逼的框架,但是这些作为基础,还是有必要了解一下。
领取专属 10元无门槛券
私享最新 技术干货