拿一下上一篇文章的例子:
1 public class Test { 2 public static void main(String[] args) throws IOException { 3 File file = new File("D:" + File.separator + "readerAndWriter.txt"); 4 //创建字符输出流 5 Writer writer = new FileWriter(file); 6 String content = "hello World 中国 center 执行"; 7 //将内容写入文件 8 writer.write(content); 9 //关闭输出流 10 // writer.close(); 11 12 //创建字符输入流 13 Reader reader = new FileReader(file); 14 char[] chars = new char[1024]; 15 //将文件的内容读取到chars数组中,并返回读取到的字符个数 16 int characterNumbers = reader.read(chars); 17 if(characterNumbers == -1){ 18 System.out.println("文件中无内容"); 19 }else{ 20 //输出读取到的内容 21 System.out.println(new String(chars)); 22 } 23 reader.close(); 24 } 25 }
注意第十行,将writer.close()方法注释之后,此时将无法将字符串写入文件
控制台输出:
说明一下原因:
字符流和字节流非常相似,但也有区别,从网上找了一张图:
、
从图上看,字符流和字节流最大的区别在于,字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流操作时使用了缓冲区,通过缓冲区再操作文件。这也解释了上面程序的那个问题,为什么不对资源进行close()就无法写入文件的原因。因为在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果没有关闭,缓冲区中的内容是无法输出的。
什么是缓冲区?简单理解,缓冲区就是一块特殊的内存区域。为什么要使用缓冲区?因为如果一个程序频繁操作一个资源(文件或数据库),则性能会很低,为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域读取数据即可,因为读取内存的速度要快于读取磁盘中文件内容的速度。
在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区。
如果不想在关闭时再输出字符流的内容也行,使用Writer的flush()方法就可以了。
https://blog.csdn.net/Bazingaea/article/details/51277344
Java IO6:字符流进阶及BufferedWriter、BufferedReader
原文:https://www.cnblogs.com/zfyang2429/p/10497380.html