IO_Object字节处理流

Object处理流:能够将基本数据类型或者对象进行序列化和反序列化操作

序列化与反序列化:

1.序列化就是在保存数据时,保存数据的值和数据类型

2.反序列化就是在恢复数据时,恢复数据的值和数据类型

注意事项和细节说明

1.序列化读写顺序要求一致

2.要求实现序列化或反序列化,需要实现Serializable(标识接口,推荐选择该接口)或Externalizable(一般不选用该接口)

3.序列化的类中建议添加serialVersionUID以提高版本的兼容性

4.序列化对象时,默认将类内部所有属性都序列化,故要求属性的类型都实现了序列化接口。但static和transient修饰的属性不进行序列化

5.序列化具备可继承性,若父类为可序列化类,其子类也可序列化

注:标识接口即没有任何方法和属性的接口,不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定的类型。

ObjectOutputStream

@Test
    public void write() throws IOException {
        //文件后缀名不重要 序列化的有自己的保存方式(非纯文本)
        String filePath = "E:\\data.dat";
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(filePath));

        objectOutputStream.writeInt(100);//int在底层会自动装箱成Integer Integer实现了Serializable接口
        objectOutputStream.writeBoolean(true);//boolean -> Boolean
        objectOutputStream.writeByte(1);//byte -> Byte
        objectOutputStream.writeChar('A');//char -> Character
        objectOutputStream.writeUTF("hello");//String实现了Serializable接口
        //......
        //保存一个people对象
        objectOutputStream.writeObject(new People("jay",20));

        objectOutputStream.close();
    }

ObjectInputStream

@Test
    public void read() throws IOException, ClassNotFoundException {
        String filePath = "E:\\data.dat";
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(filePath));

        //反序列化的顺序需要和序列化的顺序一致 否则会出现异常
        System.out.println(objectInputStream.readInt());
        System.out.println(objectInputStream.readBoolean());
        System.out.println(objectInputStream.readByte());
        System.out.println(objectInputStream.readChar());
        System.out.println(objectInputStream.readUTF());
        //people的编译类型是Object 运行类型是People
        Object people01 = objectInputStream.readObject();
        System.out.println("运行类型 = "+ people01.getClass());
        System.out.println(people01.toString());

        //如果想调用people的函数 需要向下转型
        People people02 = (People)people01;
        System.out.println(people02.getName() +" "+ people02.getAge());

        objectInputStream.close();
    }

People(建议设置成公共类,因为二者都需要访问)

public class People implements Serializable {
    private String name;
    private int age;

    //serialVersionUID为序列化的版本唯一号 可以提高兼容性
    //存在版本号的时候 对类进行修改 系统只会认为类进行了版本修改 而不会认为这是一个新的类
    private static final long serialVersionUID = 1;
    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

icoFoam 求解器名称 |-createFields.H 场变量的声明和初始化 ————————————————————————————————————————————— Info<< "Reading transportProperties\n" << endl; //屏幕提示读入参数控制文件,等价于 C++中std::cout //声明属性字典类对象,该对象由 constant 文件夹下的“transportProperties”初始化创建。 IOdictionary transportProperties ( IOobject //其实IOobject,顾名思义就是输入输出对象,它完成的是一个桥梁的作用,即连接要构造的类及硬盘中的相应文件。这可以通过其成员函数objectStream()了解到,当完成了“搭桥”之后,便可通过这一成员函数返回硬盘文件对应的输入,从而从输入中读入将要构造的类的相关信息// ( "transportProperties", // 文件名称 runTime.constant(), // 文件位置,case/constant mesh, // 网格对象 IOobject::MUST_READ_IF_MODIFIED, //如果更改,必须读入 IOobject::NO_WRITE // 不对该文件进行写操作 ) ); //字典查询黏性,以便初始化带有单位的标量 dimensionedScalar nu ( transportProperties.lookup("nu") ); //屏幕提示创建压力场 Info<< "Reading field p\n" << endl; //创建压力场 volScalarField p //声明一个带单位的标量场,网格中心存储变量。 ( IOobject // IOobject主要从事输入输出控制 ( "p", // 压力场初始文件名称 runTime.timeName(), // 文件位置,由case中的system/controlDict中的startTime控制 //
Java 中的 IO 是一种用于读取和写入数据的机制,它可以通过不同的方式进行操作,例如读写文件、网络连接、标准输入输出等。 ObjectInputStream 和 ObjectOutputStream 是 Java 中用于序列化和反序列化对象的 IO ObjectOutputStream 可以将 Java 对象转换为字节序列并写入到输出中,而 ObjectInputStream 可以从输入中读取字节序列并将其转换为 Java 对象。 以下是一个简单的示例代码,演示了如何使用 ObjectInputStream 和 ObjectOutputStream 进行对象的序列化和反序列化: ```java public class SerializationDemo { public static void main(String[] args) { // 创建一个对象 Person person = new Person("John", 30); // 将对象序列化并写入到文件中 try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("person.ser"))) { outputStream.writeObject(person); } catch (IOException e) { e.printStackTrace(); } // 从文件中读取对象并反序列化 try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("person.ser"))) { Person deserializedPerson = (Person) inputStream.readObject(); System.out.println(deserializedPerson); } 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; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } ``` 在上面的示例代码中,我们创建了一个 Person 类,并将其实例写入到文件中,然后再从文件中读取并反序列化为一个新的 Person 对象。注意,在序列化和反序列化过程中,Person 类必须实现 Serializable 接口,否则会抛出 NotSerializableException 异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值