java之IO篇高级流——缓冲流、转化流、序列化流、打印流、压缩流

news2024/9/21 2:35:52

前言

上一篇IO流就介绍了File和基本流,这节介绍好用的高级流。

还有IO流的心得:随用随创建,什么时候不用什么时候关闭

目录

前言

一、缓冲流

1.体系图

 2.字节缓冲流

(1)用法

(2)底层原理

3.字符缓冲流

(1)用法

二、转换流 

1.作用

2.示例

三、序列化流和反序列化流

1.序列化流ObjectOutputStream

2.反序列化流ObjectInputStream 

3.关键细节

四、打印流 

1.字节打印流PrintStream

2.字符打印流PrintWriter

3.和标准输出流的关系

 五、压缩流和解压缩流

1.解压缩流ZipInputStream

 2.压缩流ZipOutputStream

(1).压缩单个文件

 (2).压缩文件夹


 

一、缓冲流

缓冲流顾名思义就是要多一个缓冲,加快数据的传输速度。但是相对字符流本身就有缓冲区的来说,字节流得到的增益比较多。

1.体系图

 2.字节缓冲流

原理:底层自带了长度为8192的缓冲区提高性能

(1)用法

1.创建基本字节流对象

2.把基本字节流包装成字节缓冲流

3.读写数据

4.关闭流

1.包装基本字节流 

2.读写数据

缓冲流的读写方法和基本流的一样,write和read系列方法。

 3.释放资源

关闭流还是用close()方法,这里只需要关闭相关的高级流,高级流所包装的基本流在底层是有关闭的,不用写包装的基本流的关闭。

(2)底层原理

比较字节基本流效率提高的原理

包装基本流创建缓冲流,传递一个8192作为缓冲区大小,即字节数组的长度

创建一个长度8192的字节数组,作为缓冲区 

每次写数据,将数据编码后的字节写到缓冲数组 

 

刷新缓冲区(基本字节流的刷新方法是空方法,因为没有缓冲区)

刷新缓冲区其实就是调用基本字节流的write将数据写到文件 

 

3.字符缓冲流

(1)用法

字符缓冲流的用法和字节缓冲流的用法一样,都是4步

1.创建基本字符流对象

2.把基本字符流包装成字符缓冲流

3.读写数据

4.关闭流

 1.将基本流包装成高级流

 原理也是底层自带了长度为8192的缓冲区提高性能

 2.字符缓冲流特有的方法

细节:readLine方法在读取的时候,一次读一整行,遇到回车换行结束

               但是他不会把回车换行读到内存当中

              意思就是你用print两次输出readLine读到的数据,两行数据会在一行。

 不同操作系统的换行符是不相同的,使用newLine()方法,可以无视平台限制

二、转换流 

转换流就是,字符流和字节流之间的桥梁,用于字节流和字符流之间的转换。

 为什么会有转换流?因为字节流想要使用字符流的方法。还有指定字符集读写(这个作用在JDK11就被淘汰了,JDK11时的Reader输入字符流的构造器就可以传入指定的字符集,底层原理就是输入字符流继承了InputStreamRead,实现字符集的指定)。

1.作用

InputStreamReader:将字节流转换为字符流

OutputStreamWriter:将字符流转换为字节流

2.示例

指定GBK读数据

指定GBK写数据 

 以GBK读,以UTF-8写

字节流用缓冲字符流的特殊方法实现一行一行读

三、序列化流和反序列化流

在数据库或文件系统中存储复杂数据对象时,序列化可以将对象转换为字节流,便于存储和后续读取。加密存储,防止用户更改数据。

1.序列化流ObjectOutputStream

作用就是,将程序中的对象序列化到文件中。

构造器和方法

示例 

对象想要放入序列化流就必须实现Serializable接口 

2.反序列化流ObjectInputStream 

作用就是,把序列化到本地文件中的对象,读取到程序中来

构造器和方法

示例 

3.关键细节

实现了 Serializable接口 的类,java会根据这个类的内容,计算一个序列号,将这个类的对象写到文件里面的时候,也会把这个类的序列号写好文件里面。

如果你修改了Javabean中的该类的代码内容,该类的序列号会变化,和反序列化的时候从文件得到的序列号发生冲突,反序列化程序就会报错。

所以如何防止出现这个问题呢?

其实我们只需要将javabean的类的添加一个属性,固定该类的序列号(版本号)就可以了。如下

注意:属性的四个修饰词是固定的,属性名也是

 那么又有一个问题,如果我的一个类的一个成员不想被序列化到文件,要怎么做?

这样其实就要在成员变量前面用transient关键词修饰

 最后一个问题,将多个自定义对象序列化到文件中,但是对象的个数不确定,该如何操作呢?

一般我们不会一个一个对象去序列化到文件中,我们通常将对象放到集合(实现 Serializable接口 )里面 ,再将这个集合序列化到文件里面,反序列化就只需要将一个集合反序列化到程序中就可以了。

案例如下

 注意注意注意:我们一定要先序列化到文件,才有反序列化这个步骤。

四、打印流 

1.字节打印流PrintStream

构造方法

注意:字符打印流是没有缓冲区的,所以开不开自动刷新都是一样的 

成员方法(写到文件) 

2.字符打印流PrintWriter

构造方法

成员方法 

3.和标准输出流的关系

如果你关闭了系统的标准输出流,就必须重新运行程序,不然后面的输出语句输出不到控制台。 

 五、压缩流和解压缩流

1.解压缩流ZipInputStream

用法:

1.创建一个解压缩流对象(参数是zip压缩文件的字节输入流)

2.获取这个解压缩流中的每一个ZipEntry对象

3.对每个对象分文件和文件夹处理

4.每次处理一个ZipEntry对象释放一次资源

解压缩的本质:把压缩包里面的每一个文件或者文件夹读取出来,看作每一个ZipEntry对象拷贝到目的地当中 

public class UnzipStreamDemo {
    public static void main(String[] args) throws IOException {
        File src = new File("D:\\aaa.zip");
        File des = new File("D:\\des");
        unzip(src, des);
    }
    private static void unzip(File src, File des) throws IOException {
        //解压的本质:把压缩包里面的每一个文件或者文件夹读取出来,按照层级拷贝到目的地当中

        //创建一个解压缩流用来读取压缩包中的数据
        ZipInputStream zip = new ZipInputStream(new FileInputStream(src));
        //要先获取到压缩包里面的每一个zipentry对象
        ZipEntry ze;
        while ((ze = zip.getNextEntry()) != null) {
            if (ze.isDirectory()){
                //文件夹:需要在目的地dest处创建一个同样的文件夹
                File dir = new File(des, ze.getName());
                dir.mkdir();
            }else {
                //文件:需要读取到压缩包中的文件,并把他存放到目的地dest文件夹中(按照层级目录进行存放)
                File file = new File(des, ze.getName());
                FileOutputStream fos = new FileOutputStream(file);
                int b;
                while ((b = zip.read()) != -1) {
                    fos.write(b);
                }
                fos.close();
                //表示在压缩包中的一个文件的数据处理完毕了。
                zip.closeEntry();
            }
        }
    }
}

 2.压缩流ZipOutputStream

用法:

1.创建压缩流关联压缩包

2.创建ZipEntry对象,表示压缩包里面的每一个文件和文件夹(参数是相对压缩包的路径)

3.把ZipEntry对象放到压缩包当中

4.把src文件中的数据写到压缩包当中

5.每次处理一个ZipEntry对象释放一次资源

压缩本质:把每一个(文件/文件夹)看成ZipEntry对象放到压缩包中,最终产生一个.zip的压缩包

(1).压缩单个文件

 (2).压缩文件夹

 下面压缩的实现方法,最重要的是每一个ZipEntry对象的路径,是压缩包的路径

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1983567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaSE之常用API(前一部分)

一、String 1.1 是什么 String字符串类,底层就是一个字符数组,所以字符串很多特性就是数组的特征 1 字符串一旦创建,不能修改 2 为了提高字符串的访问效率,Java提供了一种缓存技术,字符串常量池 3 如果是用" " 就不会再堆内存创建对象,而是直接再常量池进行搜索,如果…

Java反序列化漏洞实战:原理剖析与复现步骤

文章目录 java反序列化概念数据示例Ysoserial工具使用概念原生态api第三方组件概念复现 反序列化示例靶场过程 在现代应用程序开发中,Java反序列化漏洞已成为一个备受关注的安全问题。反序列化是Java中用于将字节流转换回对象的过程,但如果没有妥善处理&…

搭建PXE实现服务器自动部署

PXE(Preboot Execution Environment)是一种计算机启动技术,它允许计算机从网络上的服务器而不是从本地硬盘或光盘等存储介质上启动。这种技术主要应用在无盘工作站、网络安装操作系统、远程维护等方面。 环境:一台rhel7.9作为PXE…

Java学习十五—异常处理

一、关于异常 1.1 简介 在Java中,异常(Exception)是指程序执行过程中可能遇到的意外或错误情况。 Java异常处理是Java语言中一个重要的机制,用于处理程序运行时发生的异常情况。 ​​ 1.2 分类 Java异常分为两大类&#xff1…

STM32 驱动直流无刷电机(BLDC)发声

STM32驱动直流无刷电机(BLDC)发声 ✨需要注意,这是驱动直流无刷电机(BLDC)发出声音,不是直接驱动无刷电机转动。 📍内容移植参考:ttps://github.com/AlkaMotors/AM32-MultiRotor-ESC-firmware📍Arduino平台BLDC Music开…

小程序开发入门:第一天的学习和实践指南

目录 一. 理解小程序的基本概念 1. 无需安装 2. 快速启动 3. 界面简洁 4. 独立性和封闭性 5. 数据安全 6. 框架结构 7. 生命周期 8. 全局配置 9. API支持 10. 发布和更新 二、选择合适的开发工具 1. 微信开发者工具 2. Visual Studio Code 3. Sublime Text 4. …

荣耀手机怎么录屏?荣耀手机录屏功能全解析

荣耀手机作为一款受欢迎的智能手机品牌,拥有丰富的功能和实用的工具,其中包括强大的录屏功能。然而,对于一些荣耀手机用户来说,如何利用这一功能可能会感到困惑。 在数字化时代,录制屏幕上的内容已成为许多用户分享、…

AOE网及其求解关键路径

全称 Activity on Edge Network 边活动网 特点 仅存在 有向无环图 作用 用于记录完成整个工程至少花费的时间 > 哪条路径最耗时?也就是“ 关键路径 ” AOE网元素介绍 关键活动 关键路径上的活动称为关键活动 , 关键活动是不允许拖延的&#x…

ctfshow-web入门-sql注入(web186-web190)

目录 1、web186 2、web187 3、web188 4、web189 5、web190 1、web186 新增过滤 \%|\<|\>|\^ 采用 regexp 正则表达式的方法来匹配&#xff0c;payload&#xff1a; ^ 表示匹配开头&#xff0c;也就是说我们猜测 flag 的第一个字符是 c tableNamectfshow_user gro…

sql注入——环境搭建以及sqli-labs闯关

1.简介 本文将详细介绍如何在Windows系统中使用PHPStudy搭建SQLi-Labs环境&#xff0c;在刚学习SQL注入的时候&#xff0c;都需要拥有一个能SQL注入的网站。因此我们一般都是在本地搭建一个能SQL注入测试的网站&#xff0c;而SQLi-Labs是一个精心设计的SQL注入学习平台。 2. …

无心剑七律《悼李政道先生》

七律悼李政道先生 苏州才俊志凌云&#xff0c;联大求知岁月勤 异域扬名赢诺奖&#xff0c;前沿探秘破迷群 基金倡导根基固&#xff0c;学子栽培事业殷 科教倾心功绩著&#xff0c;英名不朽铸奇文 2024年8月5日 平水韵十二文平韵 这首诗是一首悼念李政道先生的七律&#xff0c;无…

【隐私计算篇】混淆电路之深入浅出

入门隐私计算的阶段&#xff0c;一般都会涉及对于混淆电路的学习&#xff0c;这是因为混淆电路是多方安全计算中的基础密码原语&#xff0c;也是隐私保护中重要的技术。为了帮助更好地理解混淆电路的原理&#xff0c;今天对其进行原理以及相关优化手段进行解析和分享。 1. 混淆…

【2024华数杯】C题成品论文及代码

问题分析 1、问题一 针对问题一&#xff0c;为了解决此问题&#xff0c;我们需要利用 python 中的内置线性扫描算法 max遍历所有城市景点数据&#xff0c;寻到最高评分&#xff0c;检索每个城市中景点获评最高评分的数量&#xff0c;随后排序并列出前 10 个城市。 2、问题二&…

sqlilab本地靶场注入less-1~less-6

如何通过information_schema数据库查表名&#xff0c;列名 首先要了解mysql和mariadb数据库默认自带的tables有哪些&#xff1a; mariadb自带数据库 information_schema performance_schema mysql MySQL自带数据库 information_schema performance_schema mysql…

ubuntu执行git svn clone发生中断:APR does not understand this error code: ra serf

问题描述 在ubuntu中执行 git svn clone <url>的时候&#xff0c;出现如下报错&#xff1a; 即 ubuntu&#xff1a;APR does not understand this error code: ra serf: The server sent a truncated HTTPresponse body.解决方法 方法一&#xff1a;使用git svn fet…

C语言 | Leetcode C语言题解之第324题摆动排序II

题目&#xff1a; 题解&#xff1a; static inline void swap(int *a, int *b) {int c *a;*a *b;*b c; }static inline int partitionAroundPivot(int left, int right, int pivot, int *nums) {int pivotValue nums[pivot];int newPivot left;swap(&nums[pivot], &a…

谈谈冯诺依曼体系

我们都知道冯诺依曼体系这张图最为代表性&#xff0c;而接下来我们就来浅谈一下各部分之间的作用~ 输入设备&#xff1a;键盘&#xff0c;磁盘&#xff0c;网卡&#xff0c;话筒等等 输出设备&#xff1a;磁盘&#xff0c;网卡&#xff0c;声卡&#xff0c;显示屏等等 这些硬件…

TiDE时间序列模型预测(Long-term Forecasting with TiDE: Time-series Dense Encoder)

时间序列预测&#xff0c;广泛用于能源、金融、交通等诸多行业&#xff0c;传统的统计模型&#xff0c;例如ARIMA、GARCH等因其简单高效而被广泛使用&#xff0c;近年来&#xff0c;随着深度学习的兴起&#xff0c;基于神经网络的预测模型也备受关注&#xff0c;表现出强大的预…

EHS行业趋势:2024年的EHS管理新动向

随着全球气候变化和资源枯竭等问题的日益严峻&#xff0c;企业对环境、健康与安全&#xff08;EHS&#xff09;管理的重视程度达到了前所未有的高度。特别是在“双碳”目标的推动下&#xff0c;绿色制造、ESG&#xff08;环境、社会与治理&#xff09;和可持续发展已成为企业的…

KAFKA-03-kafka 脚本命令使用详解

0&#xff1a;脚本总结 1、kafka-acls.sh #配置&#xff0c;查看kafka集群鉴权信息 2、kafka-configs.sh #查看&#xff0c;修改kafka配置3、kafka-console-consumer.sh #消费命令 4、kafka-console-producer.sh #生产命令 5、kafka-consumer-groups.sh #查看消费者组&#xf…