(19)IO流之字符流FileReader和FileWriter,缓冲字符流---缓冲输入字符流BufferedReader和缓冲输出字符流BufferedWriter

时间:2022-04-20 12:06:54

字符流,读取的文件是字符的时候,有两个基类一个是Reader,一个是Writer这有点拟人的感觉,人直接看懂的是文字

字符流

字节流:读取的是文件中的二进制字节流并不会帮你转换成看的懂得字符

字符流:字符流会把读到的二进制的数据进行对应的编码解码工作。 字符流 = 字节流+编码(解码)

输入字符流
Reader 输入字符流的基类 抽象类

|——FileReader 读取文件的输入字符流

FIleReader的用法:

1、找到目标文件

2、建立数据的输入通道

3、读取数据

4、关闭资源

FileWriter的使用注意事项

1、FileWriter写数据的时候,FileWriter内部维护了一个1024个字节的数组,写数据的时候,会先写入到它内部维护的字符数组,如果需要把数据真正写到硬盘上,需要调用flush方法

或者close方法或者内部数组存满时,才会把缓冲数组中的内容写入到硬盘。

2、使用FileWriter的时候,如果目标文件不错在会自动创建文件,

3、如果目标文件已存在,默认情况会先清空文件中的数据,在写入数据,如果需要在原来的基础上追加数据。需要舒勇构造函数

new FileWriter(file, true)

使用字符流拷贝图片会导致图片数据丢失,图片变小,而无法显示。

FileReader默认的是gbk编码,gbk是两个字节共可表示65536个字符,但是并非一共这么多的码子,有些是空的无法表示。

每当reader从图片中读取到的数据会先到码表中找映射到的字符,但是有些是没有字符映射的,那么会返回一个未知字符对应的

数字,而为之字符占一个字节。这样就导致了数据的丢失。

使用字符流拷贝文本文件:

 public static void copyText() throws IOException
{
//找到目标文件
File inFile = new File("E:\\ebook\\海边的卡夫卡.txt");
File outFile = new File("D:\\海边的卡夫卡副本.txt");
//建立数据通道
FileReader fileReader = new FileReader(inFile);
FileWriter fileWriter = new FileWriter(outFile);
//建立缓冲字符数组
int length = ;
int wordCount = ;
char[] buf = new char[];
while((length = fileReader.read(buf))!=-)
{
wordCount += length;
fileWriter.write(buf, , length);
}
fileWriter.close();
fileReader.close();
System.out.println("wordCount = "+wordCount);
}

何时使用字符流,何时使用字节流?依据是什么?

使用字符流的应用场景?

如果是读写字符数据的时候,比如你看到到的abcd日月水火等

字节流的应用场景?

如果读写的数据都不需要转换成字符的时候比如声音文字视频,则使用字节流。

输入字符流

Reader 输入字符流的基类 抽象类

|——FileReader 读取文件的字符流

|——BufferedReder 缓冲输入字符流,为了提高侮辱数据的效率和扩张了FileReader的功能。

| 该类内部也是维护了一个字符数组。多了一个readLine()的方法

BufferedReader缓冲输入字符流的使用步骤

1、找到目标文件

2、建立数据的输入通道

3、读取数据

4、关闭资源

输出字符流

Writer 所有输出流的基类 抽象类

|——FileWriter 向文件输出字符数据的输出字符流

|——BufferWriter缓冲输出字符流 缓冲输出字符流主要作用提高FileWriter的写数据的效率和团战FielWriter的功能

BufferWiter的使用步骤

1.找到目标文件

2、建立数据输出通道

3、建立缓冲输出流

4、写出数据

5、别忘了使用flush或者close

注意:BufferedWriter类的设计稍微有一点失败,这个类和FileWriter类的功能完全一样,不同之处在于,BufferedWriter

维护的内部缓冲数组更大一些,8kB而FileWriter类的内部缓冲数组是1kB,此外,BufferedWriter内部缓冲数组的大小可以使用

构造函数来制定,neLine()写入一个分分行符,就这么多