(1)字符流(Writer/Reader)处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串。
(2)字节流(OutputStream/InputStream)处理单元为1个字节,操作字节和字节数组。
(3)字节流可用于任何类型
(4)字符流只能处理字符或者字符串。
(5)字节流在操作的时候本身是不会用到缓冲区的,是与文件本身直接操作的,所以字节流在操作文件时,即使不关闭资源,文件也能输出。
(6)字符流在操作的时候是使用到缓冲区的。如果字符流不调用close或flush方法,则不会输出任何内容。

1.在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区中的内容是无法输出的,所以得出结论:**字符流使用了缓冲区,而字节流没有使用缓冲区。**字节流是直接操作文件本身的,不要使用缓冲区。
2.字节流可以处理任意类型的文件,包含字符文件,而字符流只能处理字符文件。
3.bufferedinputstream,bufferedoutputstream,bufferedreader和Bufferedwriter带缓冲区的字符流是对缓冲区的操作,不用一个一个的对字节和字符操作可以直接一行的操作readline()
4.为什么字符流是对缓冲区的操作还要有bufferreader?
因为,其只是利用到缓冲区,没有buffer的方法,必须要引用buffer缓冲区才能进行readline(),newline()等缓冲区特有的一行一行的操作,节省资源。
BufferedReader的readLine();
BufferedWriter的newLine();

流分类:
1.Java的字节流
InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。
2.Java的字符流
Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。
InputStream,OutputStream,Reader,writer都是抽象类。所以不能直接new

字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的
但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化
这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联
在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的

在从字节流转化为字符流时,实际上就是byte[]转化为String时,
public String(byte bytes[], String charsetName)
有一个关键的参数字符集编码,通常我们都省略了,那系统就用操作系统的lang
而在字符流转化为字节流时,实际上是String转化为byte[]时,
byte[] String.getBytes(String charsetName)
也是一样的道理