JavaSE—IO流 ( 八千字带你快速深入理解IO流体系 )(一):https://developer.aliyun.com/article/1555388
📌 节点流与处理流
● 按 封装类型 流又分为:
- 节点流:直接封装的是文件, 数据.
- 处理流:封装的是其他节点流对象; 可以提供缓冲功能, 提高读写效率.
● 节点流中常用类:
- 字节输入流 FileInputStream
- 字节输出流 FileOutputStream
- 字符输入流 FileReader
- 字符输出流 FileWriter
● 处理流中常用类:
- 缓冲字节输出流 BufferedOutputStream
- 缓冲字节输入流 BufferedInputStream
- 缓冲字符输入流 BufferedReader
- 缓冲字符输出流 BufferedWriter
代码演示:
public static void main(String[] args) throws IOException { FileInputStream inputStream = new FileInputStream("D:/demo1.txt"); //封装的是一个节点流对象,可以提供缓冲功能,称为处理流/包装流 BufferedInputStream bufferedInputStream =new BufferedInputStream(inputStream,20); FileOutputStream outputStream =new FileOutputStream("E:/IO.txt"); BufferedOutputStream bufferedOutputStream =new BufferedOutputStream(outputStream,20); int size =0; byte[] bytes =new byte[10]; while ((size=bufferedInputStream.read(bytes))!=-1){ bufferedOutputStream.write(bytes,0,size); } bufferedInputStream.close(); bufferedOutputStream.close(); }
缓存区流底层代码:
📌 对象输入输出流 ( 序列化 )
✰ 基础理论知识
📌怎么理解对象输入输出流 ?
○ 把java中的对象输出到文件中,从文件中把对象输入到程序中.
📌为什么要这样做(目的) ?
当我们创建一个对象时, 如new Student( "小张",20 ); 数据存储在对象中, 对象是在内存中存储的,一旦程序运行结束, 对象就会销毁, 有时需要将对象的信息长久保存,就需要将对象输入到文件中。
( 例如系统升级,关闭服务器时将对象保存起来,升级完毕后再重新把数据还原回来.)
📌对象的序列化和反序列化:
○ 把对象输入到文件的过程也称为对象的序列化.
○ 把对象从文件输入到程序的过程称为对象的反序列化, 反序列化时会生成一个新的对象, 所以反序列化也是创建对象的一种方式.
📌注意:
当一个类的对象需要被序列化到文件时, 这个类必须要生成一个序列化编号。
○ 如果一个类需要被序列化到文件中, 那么这个类就需要实现Serializable接口, 实现后, 会自动的为该类生成一个序列化编号.
📌关于序列化编号的意义:
○ 编号是类的唯一标识,但是自动生成的编号在类信息改变后会重新为类生成一个编号。
○ 可以在类中显示的生成一个编号,这样类信息修改后,编号也不会改变。
📌常用类及基本方法:
- 对象的输出流: ObjectOutputStream
- 对象的输入流: ObjectInputStream
- 在ObjectInputStream中用readObject()方法可以直接读取一个对象。
- 在ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中。
✰ 生成序列化ID教程
📌 如何在IDEA中设置, 使可以在类中生成序列化ID ? ( 教程 )
📌 设置成功后, 当我们把鼠标移至类名处, 点击serialVersionUID即可生成编号
✰ 代码实践与测试
① 我们首先创建一个学生类,需要将学生信息序列化到文件中,切记需要实现Serializable接口.
import java.io.Serializable; //如果一个类需要被序列化到文件中,那么这个类就需要实现Serializable接口 public class Student implements Serializable { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
② 进行序列化操作,将对象数据输出到文件中,使对象的信息可以做到持久化。
//对象输出 (对象的序列化) Student student =new Student("小魏",20);//创建对象 FileOutputStream fileOutputStream = new FileOutputStream("E:/obj.txt"); ObjectOutput output = new ObjectOutputStream(fileOutputStream); output.writeObject(student); output.flush(); output.close();
③ 运行程序后发现, 对象信息保存在了文件obj.txt中(格式为乱码,但不影响最后反序列化输入结果)
④ 进行反序列化操作, 将之前保存在文件obj.txt的对象信息输入到程序中。
public static void main(String[] args) throws IOException, ClassNotFoundException { //对象输出 (对象的序列化) /* Student student =new Student("小魏",20);//创建对象 FileOutputStream fileOutputStream = new FileOutputStream("E:/obj.txt"); ObjectOutput output = new ObjectOutputStream(fileOutputStream); output.writeObject(student); output.flush(); output.close(); */ //对象输入 (对象的反序列化) FileInputStream inputStream = new FileInputStream("E:/obj.txt"); ObjectInputStream objectInputStream = new ObjectInputStream(inputStream); Student student = (Student) objectInputStream.readObject();//强制类型转换 System.out.println(student);//打印对象信息 objectInputStream.close();//记得关闭流通道 }
☞ 运行结果: