IO流-字符流--java进阶day13
1.字符流

字符流分为Reader和Writer,两者皆为抽象类,需要使用它们的子类

乱码问题: 中文在文本中,一个字占用三个字节,如果我们按照原来一个字节一个字节的转换,就会导致乱码问题
假如我们创建一次读三个字节的数组进行读取,正确情况下不会出现乱码,但如果文本中有标点符号,就会导致读取到标点符号这一个字节,加上中文的两个字节,又会导致乱码
2.字符输入流的构造方法

3.字符输入流的常用成员方法

read方法如果读取的字节个数超过有效个数,也会返回-1
如图,字符输入流读取纯文本文件,与字节流读取形式一样,并且不会有任何乱码问题

小细节:如下图,我们通过字符数组读取文本文件,数据都存在了字符数组中,我们可以直接打印字符数组(字符数组无须遍历打印),观察打印结果

会发现上图中,控制台打印出来的结果出现了很多0,这是因为我们的数组长度为1024,但是读取到的长度为5,所以把默认值打印出来了
只打印有效值方法:通过字符串的构造方法,将一个字符数组变为字符串


4.字符集

所谓字符集,就是有很多字符的集合,像之前的ASCII编码表就是字符集

windows系统默认使用的字符集就是GBK,但在系统显示时是ANSI

..

如果每一个国家都有一个字符集,那么管理起来就会非常麻烦,于是出现了一款叫做Unicode的字符集,容纳了全世界字符的集合,java使用的就是Unicode字符集

5.字符编码

字符编码就是一种规则,即字符在电脑中占用多少个字节,都是根据字符编码来决定的,比如GBK中字符编码就是一个中文占用2个字节,而Unicode中,一个中文占用3个字节
1.GBK字符编码

2.Unicode字符编码
Unicode有三种字符编码,常使用的是UTF-8

重点说UTF-8编码规则,该字符编码会按照不同的语言决定不同的占用字节,重点记中文占用3个字节即可

6.编码和解码
1.编码:字符转为字节
默认字符编码是UTF-8,使用getBytes可以将字符串转换为字节

如下图,默认字符编码是UTF-8,所以按照规则会输出13个字节(4个中文,一个逗号)

我们还会发现,在中文的3个字节中,大部分都是负数字节,这个需要重点记忆

使用GBK编码,中文的字节也是负数组成

2.解码:字节转为字符
之前使用的String构造方法就是解码,将读到的字节转换为字符

如下图,默认使用解密方式是UTF-8,编码和解码的方式要一致,否则会出现乱码问题


总结

7.FileReader原理
FileReader内部内置了一个长度为8192的数组

当我们使用read读取的时候,它会一次性读取8192个字节将数组填满

当数组被装满后,接下来会从数组里取出一个字节,再转换成字符返回给我们

每使用一次read,就会返回一个字节
在取出字节时还会结合字符编码进行判断,如果是正的,代表是英文字符,只取一个字节,如果是负数,代表是汉字,会一次取三个字节(UTF-8一个汉字,三个字节)

8.FileWriter
1.构造方法

2.常用的成员方法

重点记住的就是write直接写出字符串

9.FileWriter细节
FileWriter内部也存在内置数组,长度为1024

我们写出的数据都会先存在该数组当中,并不会直接写在文件里,如果最后我们没有进行关流操作,我们写的数据就全在缓冲区中,文件里是空的

解决方法

1.Close:Close方法关闭流对象,就会把缓冲区的数据全部写入文件中,但是使用了Close之后不能继续写出
2.Flush:Flush方法不会关闭流对象,可以将缓冲区的数据全部推入到文件中,使用后还可以继续写出

总结

案例1

我们选择使用字节流,先将图片读取,然后装入集合中,再创建字节输出流,将加密后的字节全部写出。
要注意的是,不能直接创建字节输出流,图片已经存在,字节输出流会清空所有内容,要先让容器装满图片字节再创建 下图为错误示范

答:![]()
案例2

我们使用map集合来统计出现的次数,键对应字符,值对应数字
对应题目要求的格式,我们可以使用StringBuilder来创建

案例3

首先,根据题目可知,我们要使用递归,所以要写一个方法,并且要确定好数据源(文件夹原始位置)和数据目的(文件夹目标位置)

接着,我们需要在目标位置手动创建一个文件夹作为最大的第一文件夹,用来储存后续的文件等,java代码是不会帮我们创建的

我们要创建的就是E盘中的Test文件夹,直接使用File创建即可,它的地址是E://test
我们使用子父极来确定路径,父极是E:\ ,子极是test,
src和dest是我们手动写的位置,dest我们写了E:\ ,src里面又有test,所以,我们直接使用getName获取文件名即可

完成了文件夹的创建后,我们开始获取数据源的所有文件(src的文件)

难点:如何确定字节输出流的位置,我们要将D盘下读取到的数据写到E盘的test下,newDir记录了E盘test的位置,完整的文件位置还差个文件名,如:E:\test\A.txt
而文件名就在D盘中(file是文件时,对应的文件位置为D:\Test\A.txt),所以,我们使用getName获取到文件名,再用子父极路径即可

接着,就是基本的读写操作

如果是文件夹,就进行递归操作,我们需要思考数据源和数据目的分别是谁
很明显,file此时是文件夹,我们要从file中读取数据,所以数据源就是file
我们要拷贝到的位置是E盘的Test文件夹,newDir记录的就是这个位置,所以,数据目的是newDir



浙公网安备 33010602011771号