Java IO流知识

1. Java IO 简介

Java IO(输入/输出)是处理与用户交互和与外部设备通信的 API,其提供了字节流和字符流两种类型。字节流主要用于处理二进制数据,而字符流则用于处理文本数据。Java IO API 提供了灵活而强大的工具集,帮助程序员们高效地处理文件和数据,同时提高代码的可读性和可维护性。

2. 字节流

字节流用于处理二进制数据,其中包括四个主要类:InputStream、OutputStream、FileInputStream 和 FileOutputStream。此外还有缓冲流 BufferedInputStream 和 BufferedOutputStream。

2.1 InputStream 和 OutputStream

InputStream 和 OutputStream 是 Java 中最基本的 I/O 流之一。InputStream 用于从源中读取数据,而 OutputStream 在目标中写入数据。它们是所有字节输入/输出流的父类。

2.2 FileInputStream 和 FileOutputStream

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();
}

2.3 缓冲流

缓冲流是 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();
}

2.4 数据流 DataStream

数据流 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();
}

3. 字符流

字符流用于处理文本数据,其中包括四个主要类:Reader、Writer、InputStreamReader 和 OutputStreamWriter。此外还有缓冲流 BufferedReader 和 BufferedWriter。

3.1 Reader 和 Writer

Reader 和 Writer 是 Java 中最基本的字符输入/输出流之一。它们分别用于读取和写入字符。

3.2 InputStreamReader 和 OutputStreamWriter

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();
}

3.3 BufferedReader 和 BufferedWriter

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();
}

4. 序列化和反序列化

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();
}

5. 网络编程

Java 中的网络编程可以使用 Socket 和 ServerSocket 类来实现。其中 Socket 用于发送和接收数据,ServerSocket 用于监听客户端的连接并为每个连接创建一个新的 Socket 对象。

5.1 客户端连接服务器

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();
}

5.2 服务器接受客户端连接

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();
}

猜你喜欢

转载自blog.csdn.net/weixin_58724261/article/details/131252427