字符流,读取的文件是字符的时候,有两个基类一个是Reader,一个是Writer这有点拟人的感受,人直接看懂的是文字数组
字节流:读取的是文件中的二进制字节流并不会帮你转换成看的懂得字符函数
字符流:字符流会把读到的二进制的数据进行对应的编码解码工做。 字符流 = 字节流+编码(解码)编码
输入字符流
Reader 输入字符流的基类 抽象类spa
|——FileReader 读取文件的输入字符流设计
1、找到目标文件code
2、创建数据的输入通道视频
3、读取数据blog
4、关闭资源图片
FileWriter的使用注意事项资源
1、FileWriter写数据的时候,FileWriter内部维护了一个1024个字节的数组,写数据的时候,会先写入到它内部维护的字符数组,若是须要把数据真正写到硬盘上,须要调用flush方法
或者close方法或者内部数组存满时,才会把缓冲数组中的内容写入到硬盘。
2、使用FileWriter的时候,若是目标文件不错在会自动建立文件,
3、若是目标文件已存在,默认状况会先清空文件中的数据,在写入数据,若是须要在原来的基础上追加数据。须要舒勇构造函数
new FileWriter(file, true)
使用字符流拷贝图片会致使图片数据丢失,图片变小,而没法显示。
FileReader默认的是gbk编码,gbk是两个字节共可表示65536个字符,可是并不是一共这么多的码子,有些是空的没法表示。
每当reader从图片中读取到的数据会先到码表中找映射到的字符,可是有些是没有字符映射的,那么会返回一个未知字符对应的
数字,而为之字符占一个字节。这样就致使了数据的丢失。
使用字符流拷贝文本文件:
1 public static void copyText() throws IOException 2 { 3 //找到目标文件 4 File inFile = new File("E:\\ebook\\海边的卡夫卡.txt"); 5 File outFile = new File("D:\\海边的卡夫卡副本.txt"); 6 //创建数据通道 7 FileReader fileReader = new FileReader(inFile); 8 FileWriter fileWriter = new FileWriter(outFile); 9 //创建缓冲字符数组 10 int length = 0; 11 int wordCount = 0; 12 char[] buf = new char[1024]; 13 while((length = fileReader.read(buf))!=-1) 14 { 15 wordCount += length; 16 fileWriter.write(buf, 0, length); 17 } 18 fileWriter.close(); 19 fileReader.close(); 20 System.out.println("wordCount = "+wordCount); 21 }
什么时候使用字符流,什么时候使用字节流?依据是什么?
使用字符流的应用场景?
若是是读写字符数据的时候,好比你看到到的abcd日月水火等
字节流的应用场景?
若是读写的数据都不须要转换成字符的时候好比声音文字视频,则使用字节流。
输入字符流
Reader 输入字符流的基类 抽象类
|——FileReader 读取文件的字符流
|——BufferedReder 缓冲输入字符流,为了提升侮辱数据的效率和扩张了FileReader的功能。
| 该类内部也是维护了一个字符数组。多了一个readLine()的方法
1、找到目标文件
2、创建数据的输入通道
3、读取数据
4、关闭资源
输出字符流
Writer 全部输出流的基类 抽象类
|——FileWriter 向文件输出字符数据的输出字符流
|——BufferWriter缓冲输出字符流 缓冲输出字符流主要做用提升FileWriter的写数据的效率和团战FielWriter的功能
1.找到目标文件
2、创建数据输出通道
3、创建缓冲输出流
4、写出数据
5、别忘了使用flush或者close
注意:BufferedWriter类的设计稍微有一点失败,这个类和FileWriter类的功能彻底同样,不一样之处在于,BufferedWriter
维护的内部缓冲数组更大一些,8kB而FileWriter类的内部缓冲数组是1kB,此外,BufferedWriter内部缓冲数组的大小可使用
构造函数来制定,neLine()写入一个分分行符,就这么多