JAVA 其它流 转换流 对象操作流 Properties

转换流

可以指定编码读写,但是jdk 11版本以后,就不需要用转换流了。字符流自带置顶编码读写

对象操作流

可以把对象以字节的形式写到本地文件。如果是读不懂的,需要再次用对象操作流读到内存中

对象操作输入流(对象反序列化流) ObjectInputStream (new字节流对象)

对象操作输出流(对象序列化流)ObjectOutputStream(new字节流对象)

但是如果想要某个类的对象能被序列化,那么这个类必须要实现一个接口 Serializable

Serializable  是一个标记性接口,里面没有任何方法,只是实现了就代表这个类可以被序列化

对象操作输出流:对象序列化

public static void main(String[] args) throws IOException {
User user =new User("zhangsan","zhang123");
//创建对象操作输出流对象
ObjectOutputStream oos =new ObjectOutputStream(new FileOutputStream("test\\.a.txt"));
//这里的写 是写对象的  所以是writeObject
oos.writeObject(user);
oos.close();
}

对象操作输入流:对象反序列化

public static void main(String[] args) throws IOException, ClassNotFoundException {
    ObjectInputStream ois =new ObjectInputStream(new FileInputStream("test\\.a.txt"));
    //这里返回的 类型是Object的 但是我们需要User类 所以需要做强转
    User user = (User)ois.readObject();
    System.out.println(user);
    ois.close();
}

问题:

当对象序列化流序列化了一个对象后,如果我们修改了对象所属的javaBean类,读取数据会出问题,并抛出InvalidClassException异常  

虚拟机  会自动计算出我们类的一个序列号,如果修改javabean 那么 序列号发生改变 就没法对应类了 

这时候我们可以手动设定序列号:

private static final long serialVersionUID= 42l; //设定的号只要不超过long的范围就行

如果太长记不住,可以去ArrayList类看 然后复制就行了

 

如果我们某个变量的值不想被序列化呢?

直接类定义成员变量的时候用 transient 关键字修饰

如:private transient String password;

如果要读写多个对象,我们直接创建一个集合 这样读跟写 都只需要一次

Properties  

properties  是一个map类型的集合类 他没有固定的泛型

properties 中有跟IO相关的方法

我们用的时候只存字符串

特有方法

Object setProperty​(String key, String value)

设置集合的键和值,都是String类型,底层调用 Hashtable方法 put

String getProperty​(String key)

使用此属性列表中指定的键搜索属性

Set<String> stringPropertyNames​()

从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串

这三个分别对应map 自有的  put  get  跟keySet方法

和IO流结合的方法

void load​(InputStream inStream)

从输入字节流读取属性列表(键和元素对)

void load​(Reader reader)

从输入字符流读取属性列表(键和元素对)

void store​(OutputStream out, String comments)

将此属性列表(键和元素对)写入此 Properties表中,以适合于使用 load(InputStream)方法的格式写入输出字节流

void store​(Writer writer, String comments)

将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流

如果要写properties的数据 只要写  键=值 就可以了

如 username = "zhangsan"

  password = "zhang123"

store 例子:

public static void main(String[] args) throws IOException, ClassNotFoundException {
    //创建字符输出流
    FileWriter fw =new FileWriter("test\\prop.properties");
    Properties prop = new Properties();
    prop.put("zhangsan","123");
    prop.put("lisi","456");
    prop.put("wangwu","789");
    //将键值对
    prop.store(fw,null);
}

load 例子:

public static void main(String[] args) throws IOException, ClassNotFoundException {
  FileReader fl =new FileReader("test\\prop.properties");
    Properties prop = new Properties();

    prop.load(fl);
    System.out.println(prop);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值