目录
1、概述
IO流:
用于读写文件中的数据(可以读写文件,或网络中的数据)
在IO流中,以程序为参照物判断读写
IO流分类:
纯文本文件
:用Windows自带的记事本打开能读懂的文件
2、IO流体系
3、FileOutputStream
作用:
操作本地文件的字节输出流,可以把程序中的数据写到本地文件中
写出步骤:
-
创建字节输出流对象
-
写数据
-
释放资源
细节:
-
参数是字符串表示的路径或是File对象都可
-
如果文件不存在会创建一个新的文件,但要保证父级路径是存在的
-
如果文件已经存在,则会清空文件
-
write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
FileOutputStream写数据的三种方式:
换行与续写:
换行写:再写出一个换行符就可以了(Windows:\r\n Linux: \n Mac: \r)
在Windows操作系统中,java对回车换行进行了优化,虽然完整的是”\r\n”,但我们只写一个“\r”或”\n”,java也可执行,因为java在底层会补全
续写:
如果想续写,打开续写开关即可
开关位置:创建对象的第二个参数
默认false:关闭续写,此时创建对象会清空文件
手动传true:打开续写,此时创建对象不会清空文件
4、FileInputStream
作用:
操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来
书写步骤:
-
创建字节输入流对象
-
读数据
-
释放资源
细节:
-
如果文件不存在,会直接报错
-
一次读一个字节,读出来的是数据在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 乱码
原因:
-
读取数据时为读完整个汉字
-
编码和解码时的方式不统一
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 压缩文件夹