18 IO流

目录

1、概述

2、IO流体系

3、FileOutputStream

4、FileInputStream

5、try...catch异常处理

6、字符集详解

6.1 GB2312字符集:

6.2 BIG5字符集:

6.3 GBK字符集:

6.4 Unicode字符集:

6.5 乱码

7、字符流

7.1 FileReader

7.2 FileWriter

8、编码、解码

9、缓冲流

9.1 字节缓冲流

9.2 字符缓冲流

10、转换流

11、序列化流与反序列化流

11.1 序列化流

11.2 反序列化流

11.3 版本号、序列号

12、打印流

12.1 字节打印流

12.2 字符打印流

13、解压缩流、压缩流

13.1 解压缩流

13.2 压缩流

13.2.1 压缩单个文件

13.2.2 压缩文件夹


1、概述

IO流:用于读写文件中的数据(可以读写文件,或网络中的数据)

在IO流中,以程序为参照物判断读写

IO流分类:

纯文本文件:用Windows自带的记事本打开能读懂的文件

2、IO流体系

3、FileOutputStream

作用:操作本地文件的字节输出流,可以把程序中的数据写到本地文件中

写出步骤:

  1. 创建字节输出流对象

  2. 写数据

  3. 释放资源

细节:

  • 参数是字符串表示的路径或是File对象都可

  • 如果文件不存在会创建一个新的文件,但要保证父级路径是存在的

  • 如果文件已经存在,则会清空文件

  • write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符

FileOutputStream写数据的三种方式:

换行与续写:

换行写:再写出一个换行符就可以了(Windows:\r\n  Linux: \n Mac: \r)

在Windows操作系统中,java对回车换行进行了优化,虽然完整的是"\r\n",但我们只写一个“\r”或"\n",java也可执行,因为java在底层会补全

续写:

如果想续写,打开续写开关即可

开关位置:创建对象的第二个参数

默认false:关闭续写,此时创建对象会清空文件

手动传true:打开续写,此时创建对象不会清空文件

4、FileInputStream

作用:操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来

书写步骤:

  1. 创建字节输入流对象

  2. 读数据

  3. 释放资源

细节:

  • 如果文件不存在,会直接报错

  • 一次读一个字节,读出来的是数据在ASCII上的数字

  • 读到文件末尾了,read方法返回-1

循环读取:

FileInputStream fis = new FileInputStream("....");

int b; //一定要定义第三方变量

while((b = fis.read()) != -1) {

    System.out.println((char) b);

}

5、try...catch异常处理

6、字符集详解

6.1 GB2312字符集:

1980年发布,1981年5月1日实施的简体中文汉字编码国家标准。收集7445个图形字符,其中包括6763个简体汉字

6.2 BIG5字符集:

台湾地区繁体中文标准字符集,共收录13053个中文字,1984年实施

6.3 GBK字符集:

2000年3月17日发布,收录21003个汉字

包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字

Windows系统默认使用的就是GBK。系统显示ANSI

存储规则:

  • 汉字:以两个字节存储,高位字节二进制一定以1开头,转为十进制之后是一个负数

  • 英文:一个字节存储,兼容ASCII,二进制前面补0

6.4 Unicode字符集:

国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。又叫万国码。

6.5 乱码

原因:

  1. 读取数据时为读完整个汉字

  2. 编码和解码时的方式不统一

7、字符流

字符流的底层启示就是字节流,用于解决中文乱码的第一个原因

字符流=字节流+字符集

特点:

  • 输入流:一次读一个字节,遇到中文时,一次读多个字节

  • 输出流:底层会把数据按照指定的编码方式进行编码,编程字节再写到文件中

7.1 FileReader

步骤:

1、创建对象

2、读取数据

3、释放资源

7.2 FileWriter

构造方法:

成员方法:

8、编码、解码

9、缓冲流

9.1 字节缓冲流

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

构造方法:

注意:缓冲流不能单独存在,需结合基本流使用

例如:

BufferedInputStream bis = new BufferedInputStream(new FileInputStream("..."));

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("...."));

byte[] bytes = new byte[1024];

int len;

while((len = bis.read(bytes)) != -1) {

    bos.write(bytes,0,len);

}

bos.close;

bis.close;

9.2 字符缓冲流

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

构造方法:

10、转换流

转换流是字节流与字符流之间的桥梁

使用场景:

  • 指定字符集读写(JDK11后淘汰)

  • 字节流想要使用字符流中的方法

11、序列化流与反序列化流

11.1 序列化流

可以把java中的对象写到本地文件中

11.2 反序列化流

可以把序列化到本地文件中的对象,读取到程序中来

11.3 版本号、序列号

解决更新Javabean类后已经保存的本地文件无法读取问题,在类中添加:

private static final long serialVersionUID = ...............;

细节汇总:

  • 使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口。否则,会出现NotSerializableException异常

  • 序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了

  • 序列化对象后,修改了Javabean类,再次反序列化,会出问题,会抛出InvalidClassException异常,可通过添加序列化解决

  • 如果一个对象中的某个成员变量的值不想被序列化,可以给该成员变量加transient关键字,该关键字标记的成员变量不参与序列化过程

12、打印流

分类:

打印流一般是指:PrintStream,PrintWriter两个类

特点:

  • 打印流只操作文件的目的地,不操作数据源

  • 特有的写出方法可以实现,数据原样写出

  • 特有的写出方法,可以实现自动刷新,自动换行

12.1 字节打印流

字节流底层无缓冲区,开不开自动刷新都一样

构造方法:

成员方法:

12.2 字符打印流

字符流底层有缓冲区,想要自动刷新需要开启

构造方法:

成员方法:

13、解压缩流、压缩流

13.1 解压缩流

解压本质:

把每一个ZipEntry按照层级拷贝到本地另一个文件夹中

例:

13.2 压缩流

压缩本质:

把每一个(文件/文件夹)看成ZipEntry对象放到压缩包中

13.2.1 压缩单个文件

13.2.2 压缩文件夹

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平凡的蒟蒻99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值