前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java(io流—Properties、序列化流与反序列化流)

Java(io流—Properties、序列化流与反序列化流)

作者头像
全栈开发日记
发布2022-05-12 20:31:24
2550
发布2022-05-12 20:31:24
举报
文章被收录于专栏:全栈开发日记

Properties类

表示一个持久的属性集;

特点:

  1. HashTable的子类,Map集合中的方法都可以使用;
  2. 该集合没有泛型,键值都是字符串;
  3. 持久的属性集;

特有方法:

  • Object setProperty(String key, String value):存储键值对,等同于Map集合中的put;
  • String getProperty(String key):用指定的键在此;
  • Set<String> stringPropertyNames() :将集合中键存储到Set集合中,类似于Map接口中的keyset;
  • void load(InputStream inStream):从输入流中读取属性列表(键和元素对);
  • void load(Reader reader):按简单的面向行的格式从输入字符流中读取属性列表(键和元素对);
  • void store(OutputStream out, String comments):以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流;
  • void store(Writer writer, String comments):以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符;

序列化流与反序列化流

特点:用于操作对象,可以将对象写入到文件中,也可以从文件中读取对象;

ObjectOutputStream:对象的序列化

  • void writeObject(Object obj):将指定的对象写入 ObjectOutputStream;
  • ObjectOutputStream(OutputStream out):创建写入指定 OutputStream 的 ObjectOutputStream;

资源类:

代码语言:javascript
复制
public class Person implements Serializable {//实现Serializable接口
    private String name;
    private String age;

    public Person(String name, String age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public Person() {

    }
}

注意事项:

进行序列化时,需要实现一个标识性接口Serializable;

测试类序列化方法:

代码语言:javascript
复制
public static void med() throws Exception{
    FileOutputStream fos=new FileOutputStream("d:\\Java\\person.txt");
    ObjectOutputStream oos=new ObjectOutputStream(fos);
    Person p=new Person("小强","20");
    oos.writeObject(p);
    oos.close();
}

序列化运行结果:文件中文字不是编码问题造成的;

ObjectInputStream:对象的反序列化

  • ObjectreadObject():从ObjectInputStream读取对象;
  • ObjectInputStream(InputStream out):创建写入指定InputStream的 ObjectInputStream;

测试类反序列化方法:

代码语言:javascript
复制
public static void med1() throws Exception{    //这里为了方便只抛了一个父类异常,详细看下图    FileInputStream fis=new FileInputStream("d:\\Java\\person.txt");    ObjectInputStream ois=new ObjectInputStream(fis);    Object o = ois.readObject();    System.out.println(o);    ois.close();}

注意事项:

反序列化时,保证类文件.class文件存在,否则抛出ClassNotFoundException异常;

反序列化运行结果

在序列化之后修改源码,会导致反序列化时抛序列号不相同异常;如下:

解决方式:在资源类中添加如下一行

注意:图中选中的部分不可变,前面的修饰符和后面的值都是可以随意修改的;

这样就可以手动绑定序列号,不会造成序列号不同异常;

代码语言:javascript
复制
private static final long serialVersionUID = 42L;
//对类的序列号进行了绑定

如果你不想让资源类中某一个变量序列化;

可使用以下方法:

  • transient:阻止成员变量序列化;
  • static:无法进行序列化;

如图位置:

io流往期:

Java(io流—字节输入流、字节输出流)

java(io流—字符输入流、字符输出流、转换流)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈开发日记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档