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) ;    // 输出内容
            }
        }
    }
};
时间: 2024-08-01 10:42:11

java基础篇---I/O技术(三)的相关文章

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

接着上篇http://www.cnblogs.com/oumyye/p/4314412.html java I/O流---内存操作流 ByteArrayInputStream和ByteArrayOutputStream ByteArrayInputStream包含一个内部缓冲区,该缓冲区包含从流中读取的字节,内部计数器跟着read方法要提供的下一个字节.FileInputStream是把文件当做数据源.ByteArrayInputStream则是把内存中的某一个数组单做数据源.ByteArray

java基础篇---I/O技术

对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输入流:数据源到程序(inputStream,Reader读进来) 输出流:程序到目的地(OutPutStream,Writer写出去) 处理数据单元: 字节流:按照字节读取数据(InputStream,OutputStream) 字符流:按照字符读取数据(Reader,Writer) 功能不同 节点流:直接从数据源或目的地读写数据 处

【Java 基础篇】【第三课】表达式、控制结构

这两天再看敏捷开发流程,我这个算是敏捷博客吗? 哈哈o(∩_∩)o 1 package a.b; 2 3 public class Three 4 { 5 static void Expression() 6 { 7 System.out.println("一.学习基本的表达式"); 8 9 // 数学表达式 10 System.out.println( 1 + 2 ); //加法 11 System.out.println( 4 - 3.2 ); //减法 12 System.out

java基础篇IO流的规律

前两篇降了IO流中的字节流和字符流复制的例子,今天来总结一下IO流的规律 掌握好IO流的规律,再开发中会很好用 下面来总结一下: 1,明确源和目的 源:输入流 InputStream 和Reader 目的:输出流 OutputStream 和Writer 2,操作的数据是否是纯文本. 是:使用字符流 不是:使用字节流 3,当体系明确后,在明确要使用哪个具体的对象,通过设备来进行区分 源设备: 内存,硬盘,键盘 目的设备: 内存,硬盘,控制台 这里的源就是你想进行的操作,比如说你想从c盘复制一个文

Java 基础篇之反射

Java 基础篇之反射 反射# 使用反射获取程序运行时的对象和类的真实信息. 获取 Class 对象# 每个类被加载之后,系统会为该类生成一个对应的 Class 对象,通过该 Class 对象可以访问到 JVM 中的这个类. 使用 Class 类的 forName(String clazzName) 静态方法.字符串参数的值是某个类的全限定类名,必须包含完整的包名 调用某个类的 class 属性 调用某个对象的 getClass() 方法.该方法是 java.lang.Object 类中的一个方

黑马程序员——Java基础篇之对象归要

1.static关键字 1.1.static可以修饰成员变量,成员方法,还有类(其中这里的类是内部类) 1.2.static修饰的部分会随着类的加载而加载: 加载过程:当JVM执行static修饰的代码时,会在内存的共享区给static部分开辟一个空间,供该类持有,static部分不是某个对象的部分,而是该类共有的,所以当一个函数会被多个对象调用时,最好定义成static,这样比较节省空间. 1.3.静态方法只能访问静态成员 原因:如果静态方法中调用了非静态的变量,那么由于静态方法是随着类的加载

Java基础篇Socket网络编程中的应用实例

说到java网络通讯章节的内容,刚入门的学员可能会感到比较头疼,应为Socket通信中一定会伴随有IO流的操作,当然对IO流比较熟练的哥们会觉得这是比较好玩的一章,因为一切都在他们的掌握之中,这样操作起来就显得非常得心应手,但是对于IO本来就不是多熟悉的哥们来说就有一定的困难了,在搞清楚IO流操作机制的同时还必须会应用到Socket通信中去,否则会对得到的结果感到非常郁闷和懊恼,下面就和大家一起分享一下自己遇到一点小麻烦后的感触以及给出的解决办法. 要求:客户端通过Socket通信技术上传本地一

JAVA基础篇八(Java,C++中的网络)

基础篇写到这里,C++和JAVA的基础知识也要讲完了,至于更深入的使用,则需要单独寻找每种语言特有的类库. 讲到网络,不可避免地要讲TCP/IP的基本使用方法.本文只对两种语言的网络实现做简单介绍,后续学习中如果有详细说明,会逐步添加到本文中. 1.C++网络知识 简单的TCP/IP: server端: #include <WINSOCK2.H> #include <stdio.h> #pragma comment(lib,"ws2_32.lib") void

面试准备&amp;总结-Java基础篇

在vps的服务器到期了,在hw又不能访问,直接在博客园写笔记了.  基础篇 1. 集合类的继承关系,源码实现原理,初始大小和如何增长. - list类初始大小10,加载因子为1,扩容到1.5+1.底层是个Object数组,调用 System.arraycopy进行拷贝. - Vector同上,扩容倍数是两倍,是同步的,线程安全. - HashMap初始大小16,加载因子0.75f,扩容到2倍.底层是数组+链表,调用resize()调整位置. - HashTable初始大小11,加载因子0.75f