问:字节流读取中文输出可能会存在什么问题?
- 会乱码。或者内存溢出。
读取中文输出,哪个流更合适,为什么?
- 字符流更合适,最小单位是按照单个字符读取的。
代码演示如下:
public class FileReaderDemo01 { public static void main(String[] args) throws Exception { //目标:每次读取一个字符 //1.创建一个字符输入流管道与源文件接通 Reader fr = new FileReader("/Users/birdbird/Documents/Java code/Java ProMax/file-io-app/src/out04.txt"); //2.读取一个字符返回,没有可读的字符了返回-1 // int code = fr.read(); // System.out.println((char) code); // int code1 = fr.read(); // System.out.println((char) code1); //3.使用循环读取字符 int code; while ((code = fr.read()) != -1){ System.out.print((char) code); } } }
问:字符流的好处?每次读取一个字符存在什么问题?
- 读取中文字符不会出现乱码 (如果代码和文件编码一致)
- 性能较慢
public class FileReaderDemo02 { public static void main(String[] args) throws Exception{ //1.创建一个文件字符输入流与源文件接通 Reader fr = new FileReader("/Users/birdbird/Documents/Java code/Java ProMax/file-io-app/src/out04.txt"); //2.用循环,每次读取一个字符数组的数据。 char[] buffer = new char[1024]; // 1K字符 int len; while ((len = fr.read(buffer)) != -1){ String rs = new String(buffer,0,len); System.out.println(rs); } } }
问:每次读取一个字符数组的优势?
- 读取的性能得到了提升
代码演示如下:
public class FileWriterDemo03 { public static void main(String[] args) throws Exception{ //1.创建一个字符输出流管道与目标文件接通 Writer fw = new FileWriter("/Users/birdbird/Documents/Java code/Java ProMax/file-io-app/src/out04.txt"); //a.publi void write(int c):写一个字符出去 fw.write(98); fw.write('a'); fw.write('鸟'); //b.publi void write(String c)写一个字符串出去 fw.write("abc我爱中国"); //c.public void write(char[] buffer):写一个字符串出去 char[] chars = "abc我是中国人".toCharArray(); fw.write(chars); //d.public void write(String c , int pos , int len):写字符串的一部分出去 fw.write("abc我是中国人",0,2); //e.public void write(char[] buffer , int pos, int len):写字符数组的一部分出去 fw.write(chars,3,5); //fw.flush(); // 刷新后流可以继续使用 fw.close(); // 关闭了包含刷新,关闭后流不能使用 } }
问:字节流、字符流如何选择使用?
- 字节流适合做一切文件数据的拷贝(音视频,文本)
- 字节流不适合读取中文内容输出
- 字符流适合做文本文件的操作(读,写)