Java IO(输入/输出)是处理与用户交互和与外部设备通信的 API,其提供了字节流和字符流两种类型。字节流主要用于处理二进制数据,而字符流则用于处理文本数据。Java IO API 提供了灵活而强大的工具集,帮助程序员们高效地处理文件和数据,同时提高代码的可读性和可维护性。
字节流用于处理二进制数据,其中包括四个主要类:InputStream、OutputStream、FileInputStream 和 FileOutputStream。此外还有缓冲流 BufferedInputStream 和 BufferedOutputStream。
InputStream 和 OutputStream 是 Java 中最基本的 I/O 流之一。InputStream 用于从源中读取数据,而 OutputStream 在目标中写入数据。它们是所有字节输入/输出流的父类。
FileInputStream 和 FileOutputStream 分别用于读取和写入文件。使用这些流时,需要手动关闭流并捕获可能出现的异常。
try (FileInputStream inputStream = new FileInputStream("file.txt");
FileOutputStream outputStream = new FileOutputStream("output.txt")) {
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, length);
}
} catch (IOException e) {
e.printStackTrace();
}
缓冲流是 Java IO 的高级概念之一,它可以提高 I/O 性能。缓冲输入流 BufferedInputStream 和缓冲输出流 BufferedOutputStream 都用于读取和写入缓存区中的数据。
try (BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream("file.txt"));
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("output.txt"))) {
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, length);
}
} catch (IOException e) {
e.printStackTrace();
}
数据流 DataStream 是一种 Java IO 流,它可以从各种类型的对象进行输入和输出。这些流还支持跨平台和端到端通讯,并且可以处理基本类型和字符串等常见数据类型。
try (DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("data.bin"));
DataInputStream dataInputStream = new DataInputStream(new FileInputStream("data.bin"))) {
dataOutputStream.writeInt(10);
dataOutputStream.writeBoolean(true);
dataOutputStream.writeChar('a');
System.out.println(dataInputStream.readInt());
System.out.println(dataInputStream.readBoolean());
System.out.println(dataInputStream.readChar());
} catch (IOException e) {
e.printStackTrace();
}
字符流用于处理文本数据,其中包括四个主要类:Reader、Writer、InputStreamReader 和 OutputStreamWriter。此外还有缓冲流 BufferedReader 和 BufferedWriter。
Reader 和 Writer 是 Java 中最基本的字符输入/输出流之一。它们分别用于读取和写入字符。
InputStreamReader 和 OutputStreamWriter 用于将字节流转换为字符流和将字符流转换为字节流。在进行文本操作时,通常使用这些流来确保正确的编码和解码。
try (FileInputStream fileInputStream = new FileInputStream("file.txt");
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8);
FileWriter fileWriter = new FileWriter("output.txt")) {
char[] buffer = new char[1024];
int length;
while ((length = inputStreamReader.read(buffer)) != -1) {
fileWriter.write(buffer, 0, length);
}
} catch (IOException e) {
e.printStackTrace();
}
BufferedReader 和 BufferedWriter 是用于读取和写入缓冲区中数据的流。它们内部实现了缓冲区,以减少对 I/O 设备的访问次数,从而提高性能。如果您需要频繁地读写文件,使用缓冲流可以提高程序的效率。
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
writer.write(line);
writer.newLine();
}
} catch (IOException e) {
e.printStackTrace();
}
Java 中的对象可以被序列化为 byte 数组,也可以从 byte 数组反序列化为对象。这个过程可以通过 ObjectOutputStream 和 ObjectInputStream 类来实现。
public 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;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("object.bin"));
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("object.bin"))) {
Person person = new Person("Alice", 20);
outputStream.writeObject(person);
Person person1 = (Person) inputStream.readObject();
System.out.println(person1.getName());
System.out.println(person1.getAge());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
Java 中的网络编程可以使用 Socket 和 ServerSocket 类来实现。其中 Socket 用于发送和接收数据,ServerSocket 用于监听客户端的连接并为每个连接创建一个新的 Socket 对象。
try (Socket socket = new Socket("localhost", 8888)) {
OutputStream outputStream = socket.getOutputStream();
outputStream.write("Hello, Server!".getBytes());
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer);
String message = new String(buffer, 0, length);
System.out.println(message);
} catch (IOException e) {
e.printStackTrace();
}
try (ServerSocket serverSocket = new ServerSocket(8888)){
while (true) {
Socket socket = serverSocket.accept();
new Thread(() -> {
try {
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int length = inputStream.read(buffer);
String message = new String(buffer, 0, length);
System.out.println(message);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("Hello, Client!".getBytes());
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
} catch (IOException e) {
e.printStackTrace();
}