文件字节输入输出流的read和write方法使用字节数组读写数据,即以字节为单位处理数据。因此,字节流不能很好地操作Unicode字符。比如,一个汉字在文件中占用2个字节,如果使用字节流,读取不当会出现“乱码”现象。
与FileInputStream、FileOutputStream字节流相对应的是FileReader、FileWriter字符流(文件字符输入、输出流),FileReader和FileWriter分别是Reader和Writer的子类,其构造方法分别是:
1 2 3 | FileReader(String filename);FileReader(File filename); Fi1eWriter(String filename);FileWriter(File filename); FileWriter(String filename, boolean append);FileWriter(File filename, boolean append); |
字符输入流和输出流的read和write方法使用字符数组读写数据,即以字符为基本单位处理数据。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import java.io.*; public class Main { public static void main(String args[]) { File sourceFile = new File( "a.txt" ); //读取的文件 File targetFile = new File( "b.txt" ); //写入的文件 char c[] = new char [ 19 ]; //char型数组 try { Writer out = new FileWriter(targetFile, true ); //指向目的地的输出流 Reader in = new FileReader(sourceFile); //指向源的输入流 int n = - 1 ; while ((n = in.read(c)) !=- 1 ) { out.write(c, 0 ,n); } out.flush(); out.close(); } catch (IOException e) { System.out.println( "Error" +e); } } } |
注意:对于Writer流,write方法将数据首先写入到缓冲区,每当缓冲区溢出时,缓冲区的内容被自动写入到目的地,如果关闭流,缓冲区的内容会立刻被写入到目的地。流调用flush()方法可以立刻冲洗当前缓冲区,即将当前缓冲区的内容写入到目的地。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程