学习Java第十七天:1、序列化和反序列化

1、序列化和反序列化

  1. 序列化 --- 将一个java对象转换成2进制流数据过程

    因为我们做操作的java对象可能需要在多态计算机之间传递。

    如何实现序列化?

    1. 为被序列化的java对象的生成类实现一个序列化接口(Serializable)

      public interface Serializable

      特殊---该接口一个方法都没有。

      类的序列化有实现java.io.Serializable接口的类启用。

      不实现此接口的类将不会使任何状态序列化或反序列化,可序列化类的所有子类型都是可序列化的。

    2. 通过java提供ObjectOutputStream类的writeObject(Object obj)

      构造方法

      ObjectOutputStream(OutputStream out)创建一个写入指定的OutputStream字节输出流的ObjectOutputStream。

      常用方法

      void writeObject(Object obj)将指定的对象写入ObjectOutputStream

      public class Student implements Serializable{
          private String name;
          private int age;
      ​
          public String getName() {
              return name;
          }
      ​
          public void setName(String name) {
              this.name = name;
          }
      ​
          public int getAge() {
              return age;
          }
      ​
          public void setAge(int age) {
              this.age = age;
          }
      }
      public class ObjectOutputStreamTest {
          public static void main(String[] args) throws Exception{
              File file = new File("E:" + File.separator + "20220202" + File.separator + "test.txt");
              FileOutputStream fos = new FileOutputStream(file);
              ObjectOutputStream oos = new ObjectOutputStream(fos);
              Student student = new Student();
              student.setName("张三");
              student.setAge(20);
              oos.writeObject(student);
              oos.close();
              fos.close();
          }
      }

  2. 反序列化---将二进制流数据转换成java对象的过程

    需要ObjectInputStream类的Object readObject()方法读取对象。

    构造方法

    ObjectInputStream(InputStream in)

    常用方法

    Object readObject()从ObjectInputStream读取一个对象。

public class ObjectInputStreamTest {
    public static void main(String[] args) throws Exception{
        File file = new File("E:" + File.separator + "20220202" + File.separator + "test.txt");
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fis);
        Student student = (Student) ois.readObject();
        System.out.println(student.getName() +"," + student.getAge());
        fis.close();
        ois.close();
    }
}

总结:

操作步骤

  1. 创建文件对象,用来指定读写的位置

  2. 创建输入/输出流的对象

  3. 调用输入/输出对象的读(read/readXXX())/写(write/writeXXX())方法

  4. 关闭流。

  • stream结尾的是字节流,将读写的数据转换成字节数组。

  • Reader结尾的是字符输入流,将读取的数据保存给String/字符数组。

  • Writer结尾的的字符输出流,将写出的数据转换成String/字符数组。

作业1:

获取C盘下windows目录下所有的exe文件。

public class WindowsFile {
    public static void main(String[] args) {
        File file = new File("C:" + File.separator + "Windows");
        //得到C盘下的windows目录中的所有文件以及文件对象
        File[] files = file.listFiles();
        //保存的列表
        List<String> exeFileList = new ArrayList<>();
        //遍历C盘下的windows目录汇总的所有文件以及文件夹对象得到文件的名称
        for (File f : files) {
            if(f.isFile()){
                //获取文件名称
                String fileName = f.getName();
                //截取文件名称字符串得到“exe”后缀名
                String substring = fileName.substring(fileName.lastIndexOf(".") + 1);
                //通过后缀名得到指定文件
                if(substring.equals("exe")){
                    //保存到列表中
                    exeFileList.add(fileName);
                }
            }
        }
        //查看得到的exe文件
        for (String s : exeFileList) {
            System.out.println(s);
        }
    }
}

作业2:复制文件:D:\image-20221204205705789.png ---copy--->E:\20220202\image-20221204205705789.png

public class CopyFile {
    public static void main(String[] args) throws Exception {
        File fileSrc = new File("D:" + File.separator + "image-20221204205705789.png");
        File fileDes = new File("E:" + File.separator + "20220202" + File.separator + "image-20221204205705789.png");
        FileInputStream fis = new FileInputStream(fileSrc);
        FileOutputStream fos = new FileOutputStream(fileDes);
        byte[] bytes = new byte[(int)fileSrc.length()];
        fis.read(bytes);
        fos.write(bytes);
        fis.close();
        fos.close();
​
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网农民工001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值