Java中序列化和打印流

一、对象序列化和反序列化

1、概述

对象的序列化:对象中的数据,以流的形式,写入到文件中并保存的过程称为写出对象,即对象的序列化

对象的反序列化:在文件中,以流的形式,将对象读出来的过程称为读取对象,即对象的反序列化

ObjectOutputStream 写对象,实现序列化

ObjectInputStream 读取对象,实现反序列化

2、对象序列化ObjectOutputStream和反序列化ObjectInputStream

ObjectOutStream 将 Java 对象的基本数据类型和图形写入 OutputStream,可以使用ObjectOutStream 读取(重构)对象,通过在流中使用文件可以实现对象的持久存储

ObjectInputStream 对上面使用的 ObjectOutputStream 写入的基本数据和对象进行反序列化

void writeObject(Object obj):写出对象的方法

Object readObject():读取对象方法

public static void main(String[] args) throws IOException, ClassNotFoundException {

    writeObject();      //写对象,实现序列化

    readObject();      //读取对象,实现反序列化

}

private static void writeObject() throws IOException {

    //创建字节输出流,封装文件

    FileOutputStream FOS = new FileOutputStream("F:\\TestPath\\FileOutputStream.txt");

    //创建写出对象的序列化流的对象,构造方法传递字节输出流

    ObjectOutputStream OOS = new ObjectOutputStream(FOS);

    Person P1 = new Person("Tom",18);

    //调用序列化流的方法writeObject,写出对象

    OOS.writeObject(P1);

    OOS.close();

}

private static void readObject() throws IOException, ClassNotFoundException {

    FileInputStream FOS = new FileInputStream("F:\\TestPath\\FileOutputStream.txt");

    //创建反序列化流,构造方法中,传递字节输入流

    ObjectInputStream OIS = new ObjectInputStream(FOS);

    //调用反序列化流的方法 readObject()读取对象

    Object obj = OIS.readObject();

    System.out.println(obj);

    OIS.close();

}

二、序列化注意事项

1、静态不能序列化

序列化是把对象数据进行持久化存储

静态的东西不属于对象,而属于类

2、瞬态 transient 关键字

当一个类的对象需要被序列化时,某些属性不需要被序列化,这时不需要序列化的属性可以使用关键字transient

被transient修饰的属性不会被序列化

transient关键字只能修饰成员变量

3、Serializable 接口的含义

给需要序列化的类加上标记,该标记中没有任何抽象方法(如上面的Person类)

只有实现 Serializable 接口的类的对象才能被序列化

4、序列化中的序列号冲突问题

产生冲突原因:当一个类实现 Serializable 接口后,创建对象并将对象写入文件,之后更改了源代码,再次从文件中读取对象时会报异常

产生冲突分析:在编译的时候,会根据类的定义,给class文件中计算一个序列号,当序列化和反序列化(写和读)时,除了将类中的数据进行读写,会连同序列号一起读写,而当改动源码,需要重新编译,序列号也就发生变化,此时如果不进行写对象,而是直接读,此时就会出现序列号冲突的异常

解决方法:自定义序列号 private static final long serialVersionUID = 1478652478456L;  serialVersionUID 就是序列号,自定义序列号采用static final修饰,不予许修改,所以当程序源码发生变化时,序列号也不会发生变化。将这条语句复制到实现 Serializable 接口的类中任何无语法错误的位置即可,等号右边的可变

三、打印流

打印流作为添加输出数据的功能,使它们能够方便的打印地打印各种数据值表示形式。打印流根据流的分类可分为:字节打印流==>PrintStream 和 字符打印流==>PrintWriter

1、打印流特点

打印流不负责数据源,只负责数据目的

为其他输出流添加功能

永远不会抛出 IOException,但可能抛出别的异常

两个打印流的方法完全一致

构造方法就是打印流的输出目的端

PrintStream构造方法:接收 File 类型,接收字符串文件名,接收字节流 OutputStream

PrintWriter构造方法:接收字符串文件名,接收字节输出流 OutputStream ,接收字符输出流 Writer

2、打印流常用的方法

void print(String str):输出任意类型的数据

void println(String str):输出任意类型的数据,自动写入换行操作

public static void main(String[] args) throws IOException {

    FilePrintWriter();      //打印流输出目的是File对象

    FileOutputStreamPrintWriter();      //打印流输出目的是字节流对象

    FileWriterPrintWriter();        //打印流输出目的是字符流对象

    StringPrintWriter();        //打印流输出目的是String文件名

}

private static void FilePrintWriter() throws FileNotFoundException {

    File F = new File("F:\\TestPath\\FilePrintWriter.txt");

    PrintWriter PW = new PrintWriter(F);

    PW.println(100);    //原样输出

    PW.write(100);      //按ASCII表输出

    PW.close();

}

private static void FileOutputStreamPrintWriter() throws FileNotFoundException {

    FileOutputStream FOS = new FileOutputStream("F:\\TestPath\\FileOutputStreamPrintWriter.txt");

    PrintWriter PW = new PrintWriter(FOS);

    PW.println(123);

    PW.close();

}

private static void FileWriterPrintWriter() throws IOException {

    FileWriter FW = new FileWriter("F:\\TestPath\\FileWriterPrintWriter.txt");

    PrintWriter PW = new PrintWriter(FW);

    PW.println("lkjklj");

    PW.close();

}

private static void StringPrintWriter() throws FileNotFoundException {

    PrintWriter PW = new PrintWriter("F:\\TestPath\\StringPrintWriter.txt");

    PW.println(888);

    PW.close();

}

3、打印流开启自动刷新

输出的数据目的必须是流对象(OutputStream或Writer)

必须调用 println、printf、format 三个方法中的一个

public PrintWriter(OutputStream out, boolean autoFlush)

public PrintWriter(Writer out, boolean autoFlush)

private static void fun() throws IOException {

    FileWriter FW = new FileWriter("F:\\TestPath\\FilePrintWriter.txt");

    PrintWriter PW = new PrintWriter(FW,true);

    for(int i = 0;i < 5;i++)

    {

        PW.println("hello");

    }

    PW.close();

}

4、打印流复制文本文件

使用 BufferedReader+File 读取文本行

使用 PrintWriter+println 自动刷新

public static void main(String[] args) throws IOException {

    FileReader fr = new FileReader("F:\\TestPath\\FilePrintWriter.txt");

    BufferedReader br = new BufferedReader(fr);

    FileWriter fw = new FileWriter("D:\\a.txt",true);

    PrintWriter pw = new PrintWriter(fw);

    String line;

    while ((line = br.readLine()) != null)

    {

        pw.println(line);

    }

    pw.close();

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358