十九、JAVA中的序列化和反序列化(ObjectOutputStream和ObjectInputStream),编码转换流的应用

JAVA中的序列化和反序列化,编码转换流的应用

1. 序列化和反序列化

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

1、序列化:利用ObjectOutputStream,对象的信息,按固定格式转成一串字节值输出并持久保存到磁盘化。

2、反序列化:利用ObjectInputStream,读取磁盘中序列化数据,重新恢复对象。

注意:

1、 需要序列化的文件必须实现Serializable接口以启用其序列化功能。

2、 每个被序列化的文件都有一个唯一id,如果没有添加编译器会根据类的定义信息计算产生一个版本号。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Test {
       public static void main(String[] args) throws Exception, IOException {
              //序列化:就是把java对象保存在磁盘中
              ObjectOutputStream os =
                               new ObjectOutputStream(
                                                 new FileOutputStream(
                                                                      "D:\\teach\\a\\student.txt"));
             
              Student s = new Student("张三",20,"成都");
              os.writeObject(s);//序列化,把Student对象信息保存到指定文件中
             
              os.close();//关闭输出资源
             
              //反序列化:从磁盘读到程序里
              ObjectInputStream in =
                            new ObjectInputStream(
                                          new FileInputStream(
                                                        "D:\\teach\\a\\student.txt"));
             
              //反序列化,把文件里的数据读到程序中,封装成对象,默认是Object
              Object obj =in.readObject();
              System.out.println(obj);
             
       }
}
//1,如果想完成序列化,类必须实现Serializable接口
//只是用来做标记,需要序列化
class  Student implements Serializable{
       //创建对象用
       public Student(String name, int age, String addr) {
              this.name = name;
              this.age = age;
              this.addr = addr;
       }
       //一般序列化的都是属性
       String name = "张三";
       int age = 20;
       String addr = "成都";
      
       //为了看属性值
       @Override
       public String toString() {
              return "Student [name=" + name + ", age=" + age + ", addr=" + addr + "]";
       }
      
}

2. 编码转换流

用来作为桥梁,把字节流转成字符流的桥梁。用来解决字符流读写乱码问题。

2.1工具类:

OutputStreamWriter:是字节流通向字符流的桥梁

--OutputStreamWriter(OutputStream out, String charsetName)

--OutputStreamWriter(OutputStream out)     

 

InputStreamReader:是字节流通向字符流的桥梁

--InputStreamReader(InputStream in)

--InputStreamReader(InputStream in, String charsetName)

2.2案例

 
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
//编码转换流的测试
 
public class Test {
    public static void main(String[] args) {
//     method();//输出的转换流
       method2();//读取的转换流
    }
 
    private static void method2() {
       try {
           //1,创建转换对象
           //第二个参数可以设置编码表,解决乱码现象
           //文件保存时使用的是gbk编码,如果用utf-8就会乱码
//         BufferedReader in = new BufferedReader(
//                      new InputStreamReader(
//                      new FileInputStream("1.txt"),"utf-8"));//乱码
           BufferedReader in = new BufferedReader(
                  new InputStreamReader(
                         new FileInputStream("1.txt"),"gbk"));
          
           //2,读取一行数据
           String line = in.readLine();//子类BufferedReader的特有方法
           System.out.println(line);
          
           //3,释放资源
          
       }catch(Exception e) {
           e.printStackTrace();
       }
    }
 
    private static void method() {
       try {
           // 1,创建转换流输出对象,OutputStreamWriter是字节流通向字符流的桥梁
           //第二个参数可以设置编码表,解决乱码现象
           //写出去的文件如果使用了utf-8表,打开时,使用了默认的gbk编码表,就会出现乱码
//         OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("1.txt"), "utf-8");
           OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("1.txt"), "gbk");
 
           // 2,开始写出数据
           // 当数据的保存方式和打开方式,使用的不是一张表时,就会出现乱码!!
           out.write("大家好,我是渣渣辉");
 
           // TODO 3,释放资源
           out.flush();
 
       } catch (Exception e) {
           e.printStackTrace();
       }
    }
 
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值