Java复习之IO对象流

这篇博客主要是总结一下Java中的IO对象流。

1.对象序列化

对象序列化就是指将一个对象转化成二进制的byte流

两种情况:
对象保存在文件上的操作称为对象的序列化操作
对象从文件中恢复称为反序列化的操作

使用ObjectOutputStream类实现对象的序列化,使用ObjectInputStream类实现反序列

被序列化对象所在的类必须实现java.io.Serializable接口

**
 * 要序列化的对象千万不要忘记实现serializable接口
 * 标记接口,没有任何方法
 */
public class Dog implements Serializable{
    private String name;
    private int age;
    public  Dog()
    {
    }
    public Dog(String name,int age)
    {
        this.name=name;
        this.age=age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

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

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

    @Override
    public String toString() {
        return "name:"+name+" age:"+age;
    }
}

2.ObjectOutputStream

public class ObjectOutputStream
extends OutputStream
implements ObjectOutput,ObjectStreamConstants

ObjectOutputStream将java对象的基本数据类型和图形写入OutputStream

public ObjectOutputStream(OutputStream out) throws IOException

接收OutputStream实例,进行实例化操作

public final void writeObject(Object obj) throws IOException
输出一个对象

public void close() throws IOException
关闭

/**
     * 使用ObjectOutputStream把对象写入文件中
     */
    public static void writeObject()
    {
        try {
            OutputStream outputStream =new FileOutputStream(
                    new File("H:"+ File.separator+"对象输出.txt")
            );
           //根据字节输出流构造一个对象流
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
            //输出数据
            objectOutputStream.writeInt(111);
            //输出对象
            objectOutputStream.writeObject(new Dog("小白",3));
        }catch (FileNotFoundException ex)
        {
            ex.printStackTrace();
        }catch (IOException ex)
        {
            ex.printStackTrace();
        }
    }

3.ObjectInputStream

public class ObjectInputStream
extends InputStream
implements ObjectInput,ObjectStreamConstants

ObjectInputStream对以前使用的ObjectOutputStream
写入的数据和对象进行反序列化

public ObjectInputStream(InputStream in) throws IOException
根据输入流的不同,实例化ObjectInputStream类的对象

public final Object readObject() throws
IOException,ClassNotFoundException
读取对象

 /**
     * 使用ObjectOInputStream把从文件中读取对象
     */
    public static void readerObject()
    {
        try {
            InputStream inputStream=new FileInputStream(
                    new File("H:"+File.separator+"对象输出.txt")
            );
            //根据字节输入流构造一个对象流
            ObjectInputStream objectInputStream=new ObjectInputStream(inputStream);
            //读取的时候一定要按照写入的顺序读取
            //读取一个整数
            int num=objectInputStream.readInt();
            //读取一个对象
            Dog dog =(Dog)objectInputStream.readObject();
            System.out.println("num=:"+num);
            System.out.println(dog);
            objectInputStream.close();
            inputStream.close();
        }catch (FileNotFoundException ex)
        {
            ex.printStackTrace();
        } catch (IOException ex)
        {
            ex.printStackTrace();
        }catch (ClassNotFoundException ex)
        {
            ex.printStackTrace();
        }
    }

4.序列化一组对象

在序列化操作中,同时序列化多个对象时,反序列化也必须
按照顺序操作,如果想要序列化一组对象该如何操作?

序列化一组对象可采用:
对象数组的方式,因为对象数组可以向Object进行转型操作

//把一组对象序列化到文件中
    public static void writeObject2()
    {
        try {
            OutputStream outputStream =new FileOutputStream(
                    new File("H:"+ File.separator+"对象输出1.txt")
            );
            //根据字节输出流构造一个对象流
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
            //输出对象
            Dog [] dogs={new Dog("小白",3),new Dog("小红",2),
                    new Dog("小黑",4)};
            //以对象数组形式写入
            objectOutputStream.writeObject(dogs);
        }catch (FileNotFoundException ex)
        {
            ex.printStackTrace();
        }catch (IOException ex)
        {
            ex.printStackTrace();
        }
    }
//将一组对象读取到程序中来
    public static void readerObject2()
    {
        try {
            InputStream inputStream=new FileInputStream(
                    new File("H:"+File.separator+"对象输出1.txt")
            );
            //根据字节输入流构造一个对象流
            ObjectInputStream objectInputStream=new ObjectInputStream(inputStream);
            //读取的时候一定要按照写入的顺序读取
            //注意数组的强制类型转换
            Dog [] dogs =(Dog[])objectInputStream.readObject();
            //打印数组的内容
            //在不知道具体的对象的个数的时候使用foreach循环
            for(Dog dog:dogs)
            {
                System.out.println(dog);
            }
            objectInputStream.close();
            inputStream.close();
        }catch (FileNotFoundException ex)
        {
            ex.printStackTrace();
        } catch (IOException ex)
        {
            ex.printStackTrace();
        }catch (ClassNotFoundException ex)
        {
            ex.printStackTrace();
        }
    }

5.transient关键字

如果用transient声明一个实例变量,当对象存储时,它的值不需要维持

当持久化对象时,可能有一个特殊的对象数据成员我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialzation,可以在这个域前加上关键字transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值