📜  Java I O教程(1)

📅  最后修改于: 2023-12-03 15:31:30.552000             🧑  作者: Mango

Java I/O教程

Java I/O 包含了 Java 语言中输入与输出数据处理的相关操作,如文件读写、网络通信、对象序列化等。在日常的编程工作中,I/O 操作是无法避免的,因此深入学习 I/O 操作对于编程人员来说是非常重要的。

文件读写

Java 中进行文件读写操作一般使用 File 类和 FileReaderFileWriter 类。下面是一个文件读取的示例代码:

try {
    File file = new File("filepath");
    FileReader fileReader = new FileReader(file);

    int ch;
    while ((ch = fileReader.read()) != -1) {
        System.out.print((char)ch);
    }
    fileReader.close();
} catch (IOException e) {
    e.printStackTrace();
}

上述代码中,我们首先创建了一个 File 对象来表示要读取的文件,然后使用 FileReader 类创建一个用于读取该文件的输入流。然后开始循环读取文件中的字符,直到文件结束(-1),最后关闭输入流释放资源。

类似的,我们可以使用 FileWriter 类将数据写入到文件中:

try {
    File file = new File("filepath");
    FileWriter fileWriter = new FileWriter(file);

    fileWriter.write("Hello, World!");

    fileWriter.close();
} catch (IOException e) {
    e.printStackTrace();
}

在上述代码中,我们同样创建了一个 File 对象来表示要写入的文件,然后使用 FileWriter 类创建一个用于写入该文件的输出流。然后使用 write 方法将待写入的字符串写入到文件中,并最后关闭输出流释放资源。

网络通信

Java 提供了多个类来进行网络通信,其中就包括了基于 TCP 和 UDP 协议的 Socket 类。下面是一个客户端和服务端进行通信的示例代码:

服务端代码:

try {
    ServerSocket serverSocket = new ServerSocket(8888);
    Socket socket = serverSocket.accept();

    DataInputStream in = new DataInputStream(socket.getInputStream());
    System.out.println(in.readUTF());

    DataOutputStream out = new DataOutputStream(socket.getOutputStream());
    out.writeUTF("Hello, Client!");

    socket.close();
} catch (IOException e) {
    e.printStackTrace();
}

客户端代码:

try {
    Socket socket = new Socket("localhost", 8888);

    DataOutputStream out = new DataOutputStream(socket.getOutputStream());
    out.writeUTF("Hello, Server!");

    DataInputStream in = new DataInputStream(socket.getInputStream());
    System.out.println(in.readUTF());

    socket.close();
} catch (IOException e) {
    e.printStackTrace();
}

在服务端代码中,我们首先创建了一个 ServerSocket 对象来监听端口 8888,并等待客户端连接。当客户端连接成功后,我们创建了一个 DataInputStream 对象来接收来自客户端的消息,并使用 DataOutputStream 对象向客户端发送一条消息。在客户端代码中,我们首先创建了一个 Socket 对象来连接服务端指定的 IP 地址和端口号,然后使用 DataOutputStream 对象向服务端发送一条消息,并使用 DataInputStream 对象接收来自服务端的消息。

对象序列化

Java 中的对象序列化可以将一个 Java 对象转换成二进制数据流,并保存到文件或者通过网络传输到另一个计算机。反序列化则可以将这些二进制数据重新转换成原来的 Java 对象。下面是一个对象序列化的示例代码:

try {
    //将对象序列化
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("person.dat"));
    Person person = new Person("张三", 20);
    out.writeObject(person);
    out.close();

    //将对象反序列化
    ObjectInputStream in = new ObjectInputStream(new FileInputStream("person.dat"));
    Person p = (Person) in.readObject();
    System.out.println(p.getName() + "," + p.getAge());
    in.close();
} catch (IOException | ClassNotFoundException e) {
    e.printStackTrace();
}

class Person implements Serializable {
    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;
    }
}

在上述代码中,我们首先创建了一个 Person 对象,然后使用 ObjectOutputStream 将其序列化并保存到文件中。接着使用 ObjectInputStream 从文件中读取并反序列化成一个新的 Person 对象。最后我们打印这个新的 Person 对象的信息,验证其正确性。

总结

Java I/O 是 Java 语言的一个重要组成部分。无论是进行文件操作、网络通信、还是对象序列化等,都会涉及到 I/O 操作。在学习和应用 I/O 相关操作时,务必注意处理 I/O 异常和资源释放的问题,以保证程序的正确性和安全性。