Java中的转换流、压缩流、序列化流、打印流及应用场景

 更新时间:2023年06月14日 15:27:47   作者:微扬嘴角  
这篇文章主要介绍了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

再例如,运用序列化流和反序列化流读写多个对象。
方式一(读之前已知写入了多少个对象):

方式二(读之前不知道写入了多少个对象):

补充:

三、打印流

java.io.PrintStream:打印流

PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。

PrintStream特点:

1.只负责数据的输出,不负责数据的读取

2.与其他输出流不同,PrintStream 永远不会抛出 IOException

3.有特有的方法,print,println

void print(任意类型的值)
void println(任意类型的值并换行)

构造方法:

PrintStream(File file):输出的目的地是一个文件
PrintStream(OutputStream out):输出的目的地是一个字节输出流
PrintStream(String fileName) :输出的目的地是一个文件路径
PrintStream extends OutputStream

继承自父类的成员方法:

- public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
- public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
- public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。
- public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
- public abstract void write(int b) :将指定的字节输出流。

注意:

如果使用继承自父类的write方法写数据,那么查看数据的时候会查询编码表 97->a

如果使用自己特有的方法print/println方法写数据,写的数据原样输出 97->97

可以改变输出语句的目的地(打印流的流向)

输出语句,默认在控制台输出

使用System.setOut方法改变输出语句的目的地改为参数中传递的打印流的目的地

static void setOut(PrintStream out)

重新分配“标准”输出流。

到此这篇关于Java中的转换流、压缩流、序列化流、打印流及应用场景的文章就介绍到这了,更多相关java转换流、压缩流、序列化流、打印流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringMVC中的DispatcherServlet结构和初始化详解

    SpringMVC中的DispatcherServlet结构和初始化详解

    这篇文章主要介绍了SpringMVC中的DispatcherServlet结构和初始化详解,SpringMVC中Spring容器的关系是通过监听方式启动的,那么Spring与Servlet的Web容器(如:Tomcat、jetty)的关系则是通过DispatcherServlet进行关联,需要的朋友可以参考下
    2024-01-01
  • Spring Boot Log4j2的配置使用详解

    Spring Boot Log4j2的配置使用详解

    本篇文章主要介绍了Spring Boot Log4j2的配置使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • SpringBoot上传文件大小受限问题的解决办法

    SpringBoot上传文件大小受限问题的解决办法

    最近有一次由于项目升级发现了一个上传方面的问题,下面这篇文章主要给大家介绍了关于SpringBoot上传文件大小受限问题的解决办法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • Mybatis学习总结之mybatis使用建议

    Mybatis学习总结之mybatis使用建议

    这篇文章主要介绍了Mybatis学习总结之mybatis使用建议的相关资料,非常具有参考借鉴价值,需要的朋友可以参考下
    2016-05-05
  • windows java -jar无法启动jar包简单的解决方法

    windows java -jar无法启动jar包简单的解决方法

    这篇文章主要介绍了windows java -jar无法启动jar包简单的解决方法,文中通过代码介绍的非常详细,对大家学习或者使用java具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-12-12
  • java中对象转json字符串的三种常用方式

    java中对象转json字符串的三种常用方式

    本文主要介绍了java中对象转json字符串的三种常用方式,包含Jackson库,Gson库和Hutool工具类这三种,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • Java yield()线程让步实现过程解析

    Java yield()线程让步实现过程解析

    这篇文章主要介绍了Java yield()线程让步实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java对List进行排序的两种实现方法

    Java对List进行排序的两种实现方法

    这篇文章主要给大家介绍了关于Java对List进行排序的两种实现方法,第一种是实体类自己实现比较,第二种是借助比较器进行排序,下面开一起看看详细的介绍吧,有需要的朋友们可以参考借鉴。
    2016-12-12
  • SpringBoot+Redis实现不重复消费的队列的示例代码

    SpringBoot+Redis实现不重复消费的队列的示例代码

    本文主要介绍了SpringBoot+Redis实现不重复消费的队列的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • Mybatis plus枚举处理器的具体使用

    Mybatis plus枚举处理器的具体使用

    在开发中,数据库表中的字段很常见会使用枚举类型来表示一些固定的取值范围,本文主要介绍了Mybatis plus枚举处理器的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03

最新评论