流是一种抽象概念,它代表了数据的无结构化传递,用来进行输入输出操作的流就称为IO流。因此,Java中的IO流有很多类型,这时候我们就要考虑到给IO流进行分类。
Java中的IO流的分类方法大致分为以下几种:
请注意,这里的流向是以程序的运行时内存为参照的。
输入流类名中包含关键字InputStream或Reader,输出流类名中包含关键字OutputStream或Writer。
字节流操作的数据单元是8位的字节(byte),字符流操作的是16位的字符。
字节流类名中包含关键字InputStream或OutputStream,字符流类名中包含关键字Reader或Writer。
请注意,系统输入输出(System.in与System.out)都为字节流。
节点流是指程序可以向一个特定的节点读写数据,直接连接数据源;
这个节点最常见的是文件,类名中包含关键字File;还可以是数组、管道、字符串,关键字分别为ByteArray/CharArray,Piped,String。
处理流并不直接连接数据源,它大多情况是对已存在的节点流进行包装,是一种典型的装饰器设计模式。使用处理流主要是为了更方便的执行输入输出工作,如PrintStream,输出功能很强大,推荐输出时都使用处理流包装。
注意:一个IO流可以即是输入流又是字节流又或是以其他方式分类的流类型,是不冲突的。比如FileInputStream,它既是输入流又是字节流还是文件节点流。
转换流,转换流只有字节流转换为字符流,因为字符流使用起来更方便,我们只会向更方便使用的方向转化。如:InputStreamReader与OutputStreamWriter。
缓冲流,有关键字Buffered,也是一种处理流,为其包装的流增加了缓存功能,提高了输入输出的效率,增加缓冲功能后需要使用flush()才能将缓冲区中内容写入到实际的物理节点。但是,在现在版本的Java中,只需记得关闭输出流(调用close()方法),就会自动执行输出流的flush()方法,可以保证将缓冲区中内容写入。
对象流,有关键字Object,主要用于将目标对象保存到磁盘中或允许在网络中直接传输对象时使用(对象序列化),具体可参看博客Java序列化与反序列化。
推回输入流,有关键字PushBack,当程序调用推回输入流的unread()方法时,系统回把指定数组内容的内容推回到一个推回缓冲区中,在调用read()方法读入内容时,就先从推回缓冲区中读取,直到读完推回缓冲区中内容后才会从原输入流中读取。
正如我们开头所说,流是一种十分抽象的概念,它代表了数据的无结构化传递。IO流就是以流的方式进行输入输出,因此,IO流也是以此为基础来进行分类的,我们只要掌握了各自IO流的本质,也就掌握了分类的方法,我们也可以走捷径:直接去动力节点在线网站上观看免费的视频课程,里面有十分详细的IO流的分类图。
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54