目录

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

1、概述

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

二、序列化注意事项

1、静态不能序列化

2、瞬态 transient 关键字

3、Serializable 接口的含义

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

三、打印流

1、打印流特点

2、打印流常用的方法

3、打印流开启自动刷新

4、打印流复制文本文件


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

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();
}

Java中序列化和打印流相关推荐

  1. 【java笔记】字符流,Properties,序列化,打印流

    字符流 字符流=字节流+编码 package demo04;import java.io.FileInputStream; import java.io.FileNotFoundException; ...

  2. Java基础19:IO流—缓冲流、转换流、序列化、打印流、压缩流和解压流

    IO流中的一些其他流:缓冲流.转换流.序列化.打印流.压缩流和解压流 1. 缓冲流 IO流除了一些基本的流,还有在此基础上发展出来的一些更强大的流.比如能够高效读写的缓冲流,能够转换编码的转换流,能够 ...

  3. Java基础-9(缓冲流,转换流,序列化,打印流,TCP通信程序)

    51.缓冲流 概述 缓冲流,也叫高效流,是对4个基本的FileXxx 流的增强,所以也是4个流,按照数据类型分类: 字节缓冲流:BufferedInputStream,BufferedOutputSt ...

  4. JavaSE(字符流、IO资源的处理、属性集、ResourceBundle工具类、缓冲流、转换流、序列化、打印流、装饰设计模式、commons-io工具包)

    JavaSE 字符流 字符输入流[Reader] 字符输入流Reader类的概述 字符输入流Reader类的常用方法 FileReader类 FileReader类的概述 FileReader类的构造 ...

  5. java中序列化与反序列化_Java中的序列化

    java中序列化与反序列化 Java提供了一种称为序列化的机制,以按字节的有序或字节序列的形式持久化Java对象,其中包括对象的数据以及有关对象的类型和存储在对象中的数据类型的信息. 因此,如果我们已 ...

  6. java中序列化之子类继承父类序列化

    原文 父类实现了Serializable,子类不需要实现Serializable 相关注意事项     a)序列化时,只对对象的状态进行保存,而不管对象的方法:     b)当一个父类实现序列化,子类 ...

  7. 第五章 如何使用java中的线程打印偶数和奇数

    你有两个线程.您需要使用一个线程打印奇数,使用另一个线程打印偶数.您需要以自然顺序打印最多 MAX. 例如: 如果 MAX 为 10,则需要打印: 1 2 3 4 5 6 7 8 9 10 所以 1 ...

  8. Java笔记整理六(File类,递归,字节流IO,字符流IO,流中的异常处理,属性集Properties,缓冲流,转换流,序列化,打印流)

    1.File类 java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作. 文件和目录路径名的抽象表示 java把文件和文件夹封装位为一个File类,我们可 ...

  9. 【02】Java进阶:13-IO资源的处理、属性集、缓冲流、转换流、序列化、打印流、装饰设计模式、commons-io工具包

    day13[Properties类.缓冲流.转换流.序列化流.装饰者模式.commons-io工具包] 今日内容 IO异常处理 Properties类 缓冲流 转换流 序列化\反序列化流 打印流 装饰 ...

  10. 12、java中的I/O流(2)

    再介绍一下其他一些流的使用 数据操作流,数据输入流允许应用程序以独立于机器的方式从底层输入流读取原始Java数据类型,意思就是平台无关,相关的两个类DataInputStream.DataOutput ...

最新文章

  1. python 存redis失败无提示_Python Redis日志错误
  2. python操作Mysql基础
  3. 如何使用echo.js实现图片的懒加载(整理)
  4. php 反向截取,反向PHP功能
  5. 揭秘 | 连续3年支撑双11,阿里云神龙如何扛住全球流量洪峰?
  6. datatables 响应式
  7. 处理机器学习大数据的7种方法
  8. 动态规划编程面试_面试的前25大动态编程问题
  9. 【8-22】java学习笔记04
  10. response 设置头的类型 (转)
  11. 音乐网站搭建源码Sourcecode
  12. Linux——进程间通信(管道)
  13. 容器技术之Kubernetes
  14. 服务器怎么做好安全防护措施
  15. HF-LPX30 LPX20
  16. centos7 查看内存使用
  17. pamac 安装 ros-noetic-desktop-full(AUR) 失败后如何清理残留的问题
  18. Linux桌面对应的路径
  19. java udp心跳机制_心跳包机制整理汇总
  20. Jenkins执行shell脚本无法启动子进程解决

热门文章

  1. 基于hilbert变换的数字信号_基于Hilbert变换实现数字全息高精度相位重建.pdf
  2. [地图代数]处理DEM中的高程异常值——ArcGIS栅格计算的应用
  3. 带外壳版本4G LTE模块,包括华为ME909系列、移远EC20系列、移远EC200T系列
  4. python基于大数据的招聘信息实时数据分析系统的设计与实现
  5. Scala快速入门到精通 视频教程 百度云网盘下载地址
  6. CPU自制入门 第三章 编程
  7. (数据结构)约瑟夫环问题——C语言实现
  8. Proteus8.6 软件下载
  9. 手把手教你用python写游戏
  10. 无人机——凤凰模拟器篇(五)遥控器的配置教程