zoukankan      html  css  js  c++  java
  • java基础篇---I/O技术(三)

    接上一篇java基础篇---I/O技术(二)

    Java对象的序列化和反序列化

    什么叫对象的序列化和反序列化

    要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象输入流(ObjectInputStream)。使用对象输出流输出序列化对象的步骤,有时也成序列化,而使用对象输入流读入对象的过程,有时也称为反序列化

    一个对象产生之后实际上是在内存中为其开辟了一个存储空间,方便存储信息、

    对象序列化就是把一个对象变成二进制的数据流的一个方法,通过对象序列化可以反驳的实现对象的传输或存储。

    注意:如果一个类的对象想被序列化,则对象所在的类必须实现java.io.Serializable接口

    对象序列化的用途

    • 持久性:把对象的字节序列永久保存到硬盘上,通常存放在一个文件中,比如:休眠的实现,以后服务器session管理,Hibernate将对象持久化实现。
    • 网络通信:在网络上传送对象的字节序列,比如:服务器之间的数据通信,对象传递

    seriaVersionUID

    在对象进行序列化或反序列胡操作时,要考虑JDK版本问题,如果序列化的JDK和反序列化的JDK版本不统一就可能出现异常,所以在序列操作中引入一个seriaVersionUID常量,来验证版本的一致性。

    对象序列化及反序列化操作

    对象序列化依靠ObjectOutputStream,对象反序列化依靠ObjectInputStream

    序列化:ObjectOutputStream

    直接用实例

    import java.io.File ;
    import java.io.FileOutputStream ;
    import java.io.OutputStream ;
    import java.io.ObjectOutputStream ;
    public class ObjectOutputStream{
        public static void main(String args[]) throws Exception {
            File f = new File("D:" + File.separator + "test.txt") ;    // 定义保存路径
            ObjectOutputStream oos = null ;    // 声明对象输出流
            OutputStream out = new FileOutputStream(f) ;    // 文件输出流
            oos = new ObjectOutputStream(out) ;
            oos.writeObject(new Person("张三",30)) ;    // 保存对象
            oos.close() ;    // 关闭
        }
    };

    反序列化:ObjectInputStream

    import java.io.File ;
    import java.io.FileInputStream ;
    import java.io.InputStream ;
    import java.io.ObjectInputStream ;
    public class ObjectInputStream{
        public static void main(String args[]) throws Exception {
            File f = new File("D:" + File.separator + "test.txt") ;    // 定义保存路径
            ObjectInputStream ois = null ;    // 声明对象输入流
            InputStream input = new FileInputStream(f) ;    // 文件输入流
            ois = new ObjectInputStream(input) ;    // 实例化对象输入流
            Object obj = ois.readObject() ;    // 读取对象
            ois.close() ;    // 关闭
            System.out.println(obj) ;
        }
    };

    transient关键字

    在序列化操作中,如果某个属性不希望被序列化下来,可以使用transient关键字声明

    Java I/O---回退流

    回退:给了用户第二次读的机会。

    回退流

    在java IO中多有的数据都是采用顺序的读取方式,即对于一个输入流来讲都是采用从头到尾顺序读取的,如果在输入流中某个不需要的内容被读取进来,则只能通过程序将这些不需要的内容处理掉,为了解决这一的读取问题,在java中提供了一中回退输入流(PushbackInputStream,PushbackReader),可以吧读取进来的某些数据重写退回到输入流的缓冲区之中。

    使用InputStream要使用read()方法不断读取,是采用顺序的读取方式。

    回退流操作机制

    PushbackInputStream类的常用方法

    import java.io.ByteArrayInputStream ;
    import java.io.PushbackInputStream ;
    public class PushInputStreamDemo{
        public static void main(String args[]) throws Exception {    // 所有异常抛出
            String str = "www.mldnjava.cn" ;        // 定义字符串
            PushbackInputStream push = null ;        // 定义回退流对象
            ByteArrayInputStream bai = null ;        // 定义内存输入流
            bai = new ByteArrayInputStream(str.getBytes()) ;    // 实例化内存输入流
            push = new PushbackInputStream(bai) ;    // 从内存中读取数据
            System.out.print("读取之后的数据为:") ;
            int temp = 0 ; 
            while((temp=push.read())!=-1){    // 读取内容
                if(temp=='.'){    // 判断是否读取到了“.”
                    push.unread(temp) ;    // 放回到缓冲区之中
                    temp = push.read() ;    // 再读一遍
                    System.out.print("(退回"+(char)temp+")") ;
                }else{
                    System.out.print((char)temp) ;    // 输出内容
                }
            }
        }
    };
  • 相关阅读:
    盒子模型之边框border
    CSS优先级特性之权重叠加
    CSS三大特性:层叠性、继承性、优先级
    行高
    单行文本垂直居中
    !important
    【DP专题】——[USACO13OPEN]照片Photo
    1:n Oberserver模式
    025_递归算法详解
    字符串移动问题
  • 原文地址:https://www.cnblogs.com/oumyye/p/4319341.html
Copyright © 2011-2022 走看看