java的转换流、压缩流、序列化流、打印流

一、转换流
转换流属于字符流,也是一种高级流,用来包装Reader和Writer。转化流是字符流和字节流之间的桥梁。转换输入流为InputStreamReader,把把字节流转化为字符流;转化输出流为OutputStreamWriter,把字符流转化为字节流。
在这里插入图片描述
应用场景:字节流想要使用字符流中的方法则使用转换流。
例如,使用转换输入流读取文件:
一个ANSI编码的文件:
在这里插入图片描述

public class MyApp {
    public static void main(String[] args) throws IOException {
        //1.创建对象并指定字符编码读取
        InputStreamReader isr = new InputStreamReader(new FileInputStream("javase-learning\\src\\example\\org\\domain\\c(ANSI).txt"),"GBK");
        //2.读取数据
        int ch;
        while((ch = isr.read())!= -1){
            System.out.println((char)ch);
        }
        //3.释放资源
        isr.close();
    }
}

在这里插入图片描述
上述这种写法JDK11有了替代方案,使用FileReader,其实FileReader是InputStreamReader的子类。。

public class MyApp {
    public static void main(String[] args) throws IOException {
        //1.创建对象并指定字符编码读取
       FileReader fr = new FileReader("javase-learning\\src\\example\\org\\domain\\c(ANSI).txt", Charset.forName("GBK"));
        //2.读取数据
        int ch;
        while((ch = fr.read())!= -1){
            System.out.println((char)ch);
        }
        //3.释放资源
        fr.close();
    }
}

再例如,使用转化输出流写文件:

public class MyApp {
    public static void main(String[] args) throws IOException {
        //1.创建对象并指定字符编码
       OutputStreamWriter osw = new  OutputStreamWriter(new FileOutputStream("javase-learning\\src\\example\\org\\domain\\d.txt"), "GBK");
        //2.写出数据
       osw.write("你好你好");
        //3.释放资源
        osw.close();
    }
}

JDK11替代方案:

public class MyApp {
    public static void main(String[] args) throws IOException {
        //1.创建对象并指定字符编码
      FileWriter fw = new  FileWriter("javase-learning\\src\\example\\org\\domain\\d.txt", Charset.forName("GBK"));
        //2.写出数据
       fw.write("你好你好");
        //3.释放资源
        fw.close();
    }
}

再例如,将本地文件的GBK文件转为UTF-8文件:
在这里插入图片描述

在这里插入图片描述
注意:上述代码运行后d.txt的内容与b.txt的内容用记事本打开结果相同,且d.txt的编码方式为UTF-8。
二、序列化流和反序列化流
序列化流(ObjectOutputStream,也称对象操作输出流)与反序列化流(ObjectInputStream,也称对象操作输入流)属于字节流,也是高级流,是对基本流的包装。
在这里插入图片描述
序列化流可以把java中的对象输出到本地文件中。
说明:存储java对象可以用基本流直接存储属性值,还能直接对文件进行修改。而序列化流存储java对象打开文件是看不懂的,而无法直接修改,这样可以防止暂时存储在文件中的数据被用户修改。
(一)序列化流
构造方法:
在这里插入图片描述
成员方法:
在这里插入图片描述
例如,新建一个User类:
在这里插入图片描述
注意:直接使用对象输出流将对象保存到文件中会出现NotSerializableException异常,解决方法是让JavaBean类实现Serializable接口。
在这里插入图片描述
注意:可以看出实现了Serializable接口不用重写方法,因为Serializable接口中没有抽象方法,是标记型接口,一旦实现了这个接口,就表示当前的类可以被序列化。
在这里插入图片描述
编写代码实现序列化:
在这里插入图片描述
结果如下:
在这里插入图片描述
(二)反序列化流
在这里插入图片描述
在这里插入图片描述
注意:
如果将javabean对象通过序列化存入本地文件,如果这时修改javabean类,再去读取原来存储的javabean对象赋给修改后的类创建对象会报错。
为了防止报错,可以在类中定义版本号,这个版本号会存入通过序列化流存入的本地文件。
在这里插入图片描述
如果不想把某些属性字段保存到本地文件中,可以在该属性字段前加瞬态关键字transient
在这里插入图片描述
再例如,运用序列化流和反序列化流读写多个对象。
方式一(读之前已知写入了多少个对象):
在这里插入图片描述
在这里插入图片描述
方式二(读之前不知道写入了多少个对象):
在这里插入图片描述
在这里插入图片描述
补充:
在这里插入图片描述
三、打印流
四、压缩流

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值