字符流
字符流:就是在字节流的基础上,加上编码,形成的数据流 字符流底层还是字节流
字符流出现的意义:因为字节流在操作字符时,可能会有中文导致的乱码,所以由字节流引申出了字符流。
java中字节流与字符流的区别:
1、读写的时候一个是按字节读写,一个是按字符。
2、在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流。只是读写文件,和文件内容无关的,一般选择字节流。
3、以stream结尾都是字节流,reader和writer结尾都是字符流。
4、InputStream是所有字节输入流的父类,OutputStream是所有字节输出流的父类。
5、Reader是字符输入流的父类,Writer是字符输出流的父类。
第一步:创建对象 public FileReader(File file) 创建字符输入流关联本地文件 public FileReader(String pathname) 创建字符输入流关联本地文件 第二步:读取数据 public int read() 读取数据,读到末尾返回-1 public int read(char[] buffer) 读取多个数据,读到末尾返回-1 第三步:释放资源 public void close() 释放资源/关流 */ //1.创建对象并关联本地文件 FileReader fr = new FileReader("D:\\io\\b.txt"); //2.读取数据 read() //字符流的底层也是字节流,默认也是一个字节一个字节的读取的。 //如果遇到中文就会一次读取多个,GBK一次读两个字节,UTF-8一次读三个字节 //read()细节: //1.read():默认也是一个字节一个字节的读取的,如果遇到中文就会一次读取多个 //2.在读取之后,方法的底层还会进行解码并转成十进制。 // 最终把这个十进制作为返回值 // 这个十进制的数据也表示在字符集上的数字 // 英文:文件里面二进制数据 0110 0001 // read方法进行读取,解码并转成十进制97 // 中文:文件里面的二进制数据 11100110 10110001 10001001 // read方法进行读取,解码并转成十进制27721 // 我想看到中文汉字,就是把这些十进制数据,再进行强转就可以了 int ch; while((ch = fr.read()) != -1){ System.out.print((char) ch); } //3.释放资源 fr.close(); 字符输出流 第一步:创建对象 public FileWriter(File file) 创建字符输出流关联本地文件 public FileWriter(String pathname) 创建字符输出流关联本地文件 public FileWriter(File file, boolean append) 创建字符输出流关联本地文件,续写 public FileWriter(String pathname, boolean append) 创建字符输出流关联本地文件,续写 第二步:读取数据 void write(int c) 写出一个字符 void write(String str) 写出一个字符串 void write(String str, int off, int len) 写出一个字符串的一部分 void write(char[] cbuf) 写出一个字符数组 void write(char[] cbuf, int off, int len) 写出字符数组的一部分 第三步:释放资源 public void close() 释放资源/关流 代码演示: FileWriter fw = new FileWriter("D:\\io\\a.txt",true); char[] chars = {'a','b','c','我'}; fw.write(chars); fw.close();
字符流的特点
//会把文件中的数据放到缓冲区当中 缓冲区大小为8192个字节 16k FileReader fr = new FileReader("myio\\b.txt"); fr.read();//会把文件中的数据放到缓冲区当中 //清空文件 FileWriter fw = new FileWriter("myio\\b.txt"); //请问,如果我再次使用fr进行读取 //会读取到数据吗? //会把缓冲区中的数据全部读取完毕 //正确答案: //但是只能读取缓冲区中的数据,文件中剩余的数据无法再次读取 int ch; while((ch = fr.read()) != -1){ System.out.println((char)ch); } fw.close(); fr.close();