字节流还是字符流
以下说的流都是文件流。
字节流和字符流的区别
文件在磁盘上的存储是按二进制存储的,也即按字节存储的。
所以字节流就是相当于一个管道连通了应用程序和磁盘上的文件,每次读取都是以字节为单位。
而字符流虽然也相当于一个管道连通了应用程序和磁盘上的文件,但是该管道自带过滤效果,即根据编码,将字节组装成不同的字符。
为什么需要过滤呢,因为你存的时候是根据编码存的,所以读的时候自然也要根据编码读呗。
何时使用字节流字符流
如果你所要读的文件是与编码无关的,比如图像啊,视频啊, 那么就用字节流。 或者虽然你要读的文件与编码有关,但是你读的目的既不是为了显示,又不是为了使用其中的某个字符,而是为了拷贝复制,那么也是可以使用字节流的。
那么什么时候使用字符流就很显然了, 你要读的文件与编码有关,且读的目的是为了显示或者得到其中的某个字符,那么当然使用字符流了。
Java是如何识别有编码的文件的
如果是输入流,创建InputStreamReader对象时,需要传入一个字节流和指定字符编码。InputStreamReader内部根据字节流和字符编码,生成StreamDecoder对象,该对象会根据字符编码将若干个字节解码为一个字符。
如果是输出流,创建OutputStreamWriter对象时,需要传入一个字节流和指定字符编码。OutputStreamWriter内部根据字节流和字符编码,生成StreamEncoder对象,该对象会根据字符编码将一个字符编码成若干个字节。