一、流的概念
1.1、程序中所有的数据都是以流的方式进行传输或保存的
1.2、程序需要读取数据的时候要使用输入流读取数据,而当程序需要将一些数据保存(写)到磁盘的时候,就要使用输出流完成。
1.3、切记:程序是内,文件...是外
二、流的超类
2.1、字节流的超类:InputStream、OutputStream
作用:处理字节、二进制对象。(其实可用于任何类型的对象,但它不能直接处理Unicode字符)
操作对象:字节流处理单元为1个字节,操作字节和字节数组
2.2、字符流的超类: Reader、Writer
作用: 直接处理字符、字符串。
操作对象:处理的单元为2个字节的Unicode字符
拓展:字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的
2.3、用途推荐
音频文件、图片、歌曲,就用字节流好点
关系到中文(文本)的,用字符流好点
2.4、前言:
其实前言放在这里,笔者认为是不合适的,之前的铺垫只是方便读者快读进入状态
字节流和字符流的关系:
字节流不足:实际开发中很多的数据是文本,字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,于是提出了字符流的概念。
字符流的诞生:字符流按虚拟机的encode处理,也就是通过InputStreamReader,OutputStreamWriter进行字符集的转化
转化(注:初学者可以不看该转化知识,如果想了解原理,该段是有帮助的):
InputStreamReader:用于将一个字节流中的字节解码成字符,其构造函数
InputStreamReader isr = new InputStreamReader(InputStream in)的参数是一个InputStream对象 / System.in,用 对象.read(char[] data),的方式获取内容
OutputStreamWriter:用于将写入的字符编码成字节后写入一个字节流,其构造函数(之一)
OutputStreamWriter osw = new OutputStreamWriter(OutputStream out)是一个OutputStream对象,通常用对象.write(String str)的方式写到 对象绑定的输出流上。
二者都是处理流(包装流、非结点流)---不可直接操作数据!。由上可知二者底层分别是通过byte[]和String来关联它们对应的流对象!
三、字节流与字符流的区别
3.1、操作文件时的区别:
字节流:在操作时不会用到缓冲区(内存),是直接对文件本身进行操作的
字符流:在操作时则使用了缓冲区,通过缓冲区再操作文件。
3.2、存在形式区别:
在硬盘上的所有文件都是以字节形式存在的(图片,声音,视频),而字符值在内存中才会形成
注:https://segmentfault.com/a/1190000019840875