字节流和字符流

参考书籍:
1.《Java编程思想》第四版
2.https://www.jianshu.com/p/69e4bccf9604
3.https://blog.****.net/cynhafa/article/details/6882061


编程语言的IO类库中常常使用流这个概念,它代表任何有能力产生数据的数据源对象或者是有能力接收数据的接收端对象。“流”屏蔽了实际IO设备中处理数据的细节。
Java类库的IO分为输入和输出两部分。通过继承,任何自InputStream或Reader派生而来的类都含有名为read()的基本方法,用于读取单个字节或字节数组。同样,任何自OutputStream或Writer派生而来的类都含有名为write()的基本方法。用于写单个字节或者字节数组。

字节流VS字符流
实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作是用到了缓冲区,通过缓冲区再操作文件。
如图所示:
字节流和字符流

字节流
InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。

字符流
Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。
(在try后面的{}(读写代码)执行后就会自动调用流对象的close方法将流关掉 。)

关于缓冲区:
缓冲区可以简单地理解为一段内存区域。可以简单地把缓冲区理解为一段特殊的内存。某些情况下,如果一个程序频繁地操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。如果想在不关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush()方法完成。