序列化:将数据保存到文件;ObjectOutputStream;
反序列化:将文件中的数据显示出来;ObjectInputStream;
在反序列化程序中运行后能够正常输出Person的相关信息,但是在目录下的文件“person.obj”用文本编辑器打开之后却是乱码的。这是为什么呢?是不是因为写出去的编码和文本编辑器的默认编码采用了不一样的字符集?然后我们就开始想怎么能够将二者的编码格式设为一致的。
其实,这么想一开始就是错误的。为什么这么说呢,因为序列化和反序列化都是基于二进制流的,也就是说,在第二步中,其实就是将person的相关信息转化为二进制存储在了person.obj这个文件中,那么用文本编辑器打开查看的话当然是会出现乱码的。只有通过反序列化才能将存储的二进制读取出来,然后正常显示在控制台上。
package com.util; import com.bean.*; import java.util.*; import java.io.*; public class StudentUtil { /** * 从文件中获取Student集合对象List * */ public static List<Student> fileToLst() { List<Student> lsst = null; // 获取存放学生集合的文件对象 File file = new File("stu.bin"); try { if (file.exists()) { // 创建文件输入流对象 FileInputStream fin = new FileInputStream(file); // 创建缓冲区输入流对象 BufferedInputStream bin = new BufferedInputStream(fin); // 创建对象输入流 ObjectInputStream oin = new ObjectInputStream(bin); // 从对象输入流中获取学生的集合对象 lsst = (List<Student>) oin.readObject(); oin.close(); return lsst; } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return lsst; } /** * 向文件中存放学生的集合对象 * */ public static boolean listToFile(ArrayList<Student> lsst) { // 创建文件对象,指定文件存放的路径 File file = new File("stu.bin"); // 集合中有元素存在,向文件中写入数据 if (lsst != null && !lsst.isEmpty()) { try { FileOutputStream fout = new FileOutputStream(file); // 创建缓冲区输出流对象 BufferedOutputStream bout = new BufferedOutputStream(fout); // 创建对象输出流 ObjectOutputStream obout = new ObjectOutputStream(bout); obout.writeObject(lsst); obout.flush(); obout.close(); return true; } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return false; } }