对象流与数据流

1. 数据流

数据流(Data Stream)是用于读写基本数据类型字符串的流。Java提供了两个主要的数据流类:DataInputStreamDataOutputStream
1.1DataInputStream

DataInputStream是InputStream的子类,用于从输入流中读取基本数据类型和字符串。
它提供了一系列的read方法,可以读取各种类型的数据,如readInt()、readDouble()、readUTF()等。
通过DataInputStream可以保证从输入流中按照特定格式读取数据,而不必担心字节顺序和编码问题。

1.2 DataOutputStream:

DataOutputStream是OutputStream的子类,用于将基本数据类型和字符串写入输出流。
它提供了一系列的write方法,可以写入各种类型的数据,如writeInt()、writeDouble()、writeUTF()等。
通过DataOutputStream可以将数据以特定的格式写入输出流,便于后续按照相同的格式读取。

案例

// 写入数据到文件
try (DataOutputStream output = new DataOutputStream(new FileOutputStream("data.bin"))) {
    output.writeInt(42);
    output.writeDouble(3.14);
    output.writeUTF("Hello, World!");
} catch (IOException e) {
    // 异常处理
}

// 从文件中读取数据
try (DataInputStream input = new DataInputStream(new FileInputStream("data.bin"))) {
    int intValue = input.readInt();
    double doubleValue = input.readDouble();
    String stringValue = input.readUTF();
    System.out.println(intValue);
    System.out.println(doubleValue);
    System.out.println(stringValue);
} catch (IOException e) {
    // 异常处理
}

注意:
在读数据流时读操作与写操作的顺序应该一样。

2.对象流

对象流(Object Stream)用于在输入输出流中读写Java对象。主要有两个对象流类:ObjectInputStream和ObjectOutputStream。

import java.io.*;

// 定义一个可序列化的对象
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;
    }
}

public class Main {
    public static void main(String[] args) {
        // 对象序列化
        try (ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
            Person person = new Person("Alice", 25);
            output.writeObject(person);
        } catch (IOException e) {
            // 异常处理
        }

        // 对象反序列化
        try (ObjectInputStream input = new ObjectInputStream(new FileInputStream("person.ser"))) {
            Person person = (Person) input.readObject();
            System.out.println(person.getName());
            System.out.println(person.getAge());
        } catch (IOException | ClassNotFoundException e) {
            // 异常处理
        }
    }
}

注意:
该对象必须进行序列化。

3.补充:序列化与反序列化

序列化(Serialization)是指将对象转换为字节流的过程(简单理解为:将内存中的对象放置到磁盘中),而反序列化(Deserialization)则是将字节流转换回对象的过程。序列化和反序列化可以使得对象在网络传输、持久化存储等场景中进行传递和存储。

java提供了两个主要的接口来支持对象的序列化和反序列化:

  • 1. java.io.Serializable: 该接口用于标记可序列化的类。直接实现此接口即可进行对象的序列化和反序列化。

  • 2. java.io.Externalizable: 该接口继承自Serializable接口,并添加了两个方法writeExternal()和readExternal()。实现此接口可以对对象的序列化与反序列化过程进行更精细的控制。

对象的序列化和反序列化,需要满足以下条件

1.类必须实现Serializable接口:该接口是一个标记接口,表示类可以进行序列化,没有任何方法需要实现。

2.字段必须是可序列化的:类的所有字段都必须是可序列化的,或者是transient关键字修饰的字段将不会被序列化。

另外:为可序列化的类添加serialVersionUID字段,并根据类的修改情况适时更新该字段的值。这样可以在反序列化时进行版本匹配,防止出现版本不一致导致的反序列化失败。

你可能感兴趣的:(Java,java,开发语言)