java中序列化流类的使用

本文详细介绍了Java中的序列化输出流类(ObjectOutputStream)和序列化输入流类(ObjectInputStream)的使用,包括构造方法、常用方法及注意事项。主要内容包括writeObject()、write()、close()等方法的使用,以及如何进行对象的序列化和反序列化操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java中序列化流类的使用

一、序列化输出流类

功能:一个能将对象存储到文件中的输出流类,类名为ObjectOutputStream。
使用步骤:
1、创建字节输入流对象,例如FileOutputStream对象,构造方法中传递写入的文件或者文件路径和是否续写标志,当续写标志省略时,
默认为false,即将原有文件覆盖。
2、创建序列化输出流类对象,即ObjectOutputStream对象,构造方法中传递字节输入流对象,例如FileOutputStream对象。
3、调用对象写入数据的方法写入数据,例如write()、writeObject()、writeBoolean()等。如果需要写入对象,则需要调用writeObject()方法。
4、调用close方法释放资源。
注意事项:
1、建议写入数据时只调用一种写入数据的方法,否则读取数据时容易报错。
2、写入对象必须使用writeObject方法。

1.1 构造方法

功能:创建序列化输入流类对象,构造方法中传递字节输入流对象,例如FileOutputStream对象。
用法:ObjectOutputStream 对象名 = new ObjectOutputStream(字节输出流类对象);
示例:
//创建文件字节输入流对象
FileOutputStream fos = new FileOutputStream(“src\objectstream\a.txt”);
//创建序列化输出流类对象
ObjectOutputStream oos = new ObjectOutputStream(fos);

1.2 常用方法

1.2.1 writeObject()
功能:将对象写入文件的方法。
用法:ObjectOutputStream对象名.writeObject(对象)
示例:
//创建对象
Person p1 = new Person(“七七”, 500);
//调用writeObject方法写入数据
oos.writeObject(p2);
注意事项:当需要写入多个对象时有两种方法,第一种方法也是最常用的方法为将对象存储到集合(例如:ArrayList集合)中,然后调用
writeObject方法将集合存储到文件中;第二种方法是多次调用writeObject方法写入对象。
1.2.2 write()
功能:将单个字节的数据或者多个字节的数据写入文件。
用法:
1、write(int val):向文件中写入一个整数。
参数 int val 需要写入的整数。
用法 对象.write(整数)
示例 oos.write(97)
2、write(byte[] buf):向文件中写入byte数组的数据,字符串可以转换为byte数组然后写入文件。
参数 byte[] buf 需要写入的byte数组
用法 对象.write(byte数组)
示例 oos.write(“abc”.getBytes());
3、write(byte[] buf, int off, int len):向文件中写入byte数组从off开始len长度的数据。
参数 byte[] buf 需要写入的byte数组
int off 写入的开始位置
int len 写入长度
用法 对象.write(byte数组, 开始位置, 长度)
示例:oos.write(“abcdefgh”.getBytes(), 0, 5);
1.2.3 close()
功能:关闭序列化输出流释放资源。
用法:对象.close()
示例:oos.close()
序列化输出流示例:
对象类

package objectstream;

import java.io.Serializable;

/**
 * 定义一个表示人的类,继承Serializable接口
 */
public class Person implements Serializable {
    //常用变量
    private String name;    //表示姓名的变量
    private int age;    //表示年龄的变量
    //构造方法
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Person() {
    }
    //get和set方法
    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;
    }
    //toString方法
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

序列化输出流使用类

package objectstream;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

/**
 * 序列化输出流的使用
 */
public class ObjectOutputStream01 {
    public static void main(String[] args) throws IOException {
        // 创建Person对象
        Person p1 = new Person("七七", 500);
        Person p2 = new Person("可莉", 400);
        System.out.println(p1);
        //创建文件字节输入流对象
        FileOutputStream fos = new FileOutputStream("src\\objectstream\\a.txt");
        //创建序列化输出流类对象
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        //调用writeObject()方法写入对象
        oos.write(97);
        oos.writeObject(p1);
        oos.writeObject(p2);
        //调用close方法释放资源
        oos.close();
    }
}

二、序列化输入流

功能:一个将文件中的对象数据读取到内存中的类,即反序列化过程,类名为ObjectInputStream。
使用步骤:
1、创建字节输入流对象,例如FileInputStream对象,构造方法中传递读取的文件或者文件路径。
2、创建序列化输入流类对象,构造方法中传递字节输入流对象,例如FileInputStream对象。
3、调用对象的读取文件的方法,例如read()、readObject()。
4、调用对象的close方法释放资源。
注意事项:
1、读取文件中数据时要根据使用的写入方法调用对应读取数据,例如写入使用write方法,读取则需要调用read方法。
2、读取文件中的多个对象时需要try catch抛出异常作为结束标志。

2.1 构造方法

功能:创建序列化输入流对象,即ObjectInputStream对象,构造方法中传递字节输入流对象,例如FileInputStream对象。
用法:ObjectInputStream 对象名 = new ObjectInputStream(字节输入流对象)
示例:
//创建文件字节输入流对象
FileInputStream fis = new FileInputStream(“src\objectstream\a.txt”);
//创建序列化输入流对象
ObjectInputStream ois = new ObjectInputStream(fis);

2.2 常用方法

2.2.1 readObject()
功能:读取文件中的一个对象数据并返回。
用法:Object o = 对象名.readObject()
示例:Object o = ois.readObject()
注意事项:
1、方法返回的数据是Object类型,如果需要转换为数据对应的对象,可以使用强制类型转换,例如数据为Person类数据,
则使用Person p = (Person)o。
2、当文件中存储多个对象数据时需要使用try catch抛出异常作为结束标志。
示例:try {
while (true){
//调用readObject()方法读取数据
Object o = ois.readObject();
System.out.println(o);
}
}catch (EOFException e){
System.out.println(“文件读取完成”);
}
2.2.2 close()
功能:关闭序列化输出流释放资源。
用法:对象.close()
示例:ois.close()
2.2.3 read()
功能:读取单个或者多个字节的数据,文件读取完成标志为-1。
用法:
1、read():读取单个字节的数据并返回。
用法:int value = 对象名.read()
示例:int value = ois.read();
2、read(byte[]):读取多个字节缓存到byte数组中并返回读取数据长度,结束标志为-1。
用法:int len = 对象名.read(byte数组)
示例:byte[] bytes = new bytes[8]
int len = ois.read(bytes)
序列化输入流示例:

package objectstream;

import java.io.*;

/**
 * 序列化输入流类的使用
 */
public class ObjectInputStream01 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //创建文件字节输入流对象
        FileInputStream fis = new FileInputStream("src\\objectstream\\a.txt");
        //创建序列化输入流对象
        ObjectInputStream ois = new ObjectInputStream(fis);
        int len = ois.read();
        System.out.println(len);
        try {
            while (true){
                //调用readObject()方法读取数据
                Object o = ois.readObject();
                System.out.println(o);
            }
        }catch (EOFException e){
            System.out.println("文件读取完成");
        }finally {
            //调用close方法释放资源
            ois.close();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值