Java面向对象系列[v1.0.0][IO流概念体系]

Java的IO流失实现输入/输出的基础,他可以方便的实现数举得输入/输出操作,在Java中把不同的输入/输出源抽象表示为“stream”,通过stream的方式允许Java程序使用相同的方式来访问不同的输入/输出源,Stream是从源到接收的有序数据,Java把所有传统的流类型都放在了java.io包中,用来实现输入和输出功能

流的分类

输入和输出流

  • 输入流:只能从中读取数据,而不能向其写入数据
  • 输出流:只能向其写入数据,而不能从中读取数据

这里说的输入和输出是从程序运行所在内存的角度来说的,比如数据从内存到硬盘,成为输出流,在CS结构的程序中,数据从服务器通过网络流向客户端,Server端的内存负责将数据输出到网络里,因此Server端的程序使用输出流,Client端的内存负责从网络里读取数据,因此Client端的程序应该使用输入流
Java的输入流主要由InputStream和Reader作为基类,而输出流则主要由OutputStream和Writer作为基类,他们都是抽象基类,无法直接创建实例

字节流和字符流

字节流和字符流的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同,字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字符
字节流主要由InputStream和OutputStream作为基类,而字符流则主要由Reader和Writer作为基类

节点流和处理流

如果按照流的角色来区分,可以分为节点流和处理流
从/向一个特定的IO设备例如磁盘、网络等读/写数据的流,称为节点流,节点流也被称为低级流,当使用节点流进行输入/输出时,程序直接链接到实际的数据源,和实际的输入/输出节点连接
处理流则是用于对一个已经存在的流进行连接或封装,通过封装后的流来实现数据读/写功能,处理流也被称为高级流,当时用处理流进行输入/输出时,程序并不会直接连接到实际的数据源,没有和实际的输入/输出节点连接
使用处理流的优势在于只要使用相同的处理流,就可以采用完全相同的输入/输出代码来访问不同的数据源,随着处理流所包装节点流的变化,程序实际所访问的数据源也相应的发生变化
使用处理流来包装节点流是一种典型的装饰器设计模式,通过使用处理流来包装不同的节点流可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出功能,因此处理流也被称为包装流

流的概念模型

Java把所有设备里的有序数据抽象成流模型,简化了输入和输出的处理,Java的IO流共涉及40多个类,这40多个类都是从如下4个抽象类派生的

  • InputStream/Reader:所有输入流的基类,前者是字节输入流,后者是字符输入流
  • OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流
    • 字节和字符就是流中的最小输入/输出单位
    • 输入流和输出流都使用隐式的记录指针的方式来表示当前正准备从哪个字节或者字符开始读取,每当程序从流利读取一个或多个字节/字符后,记录指针自动后移,并且提供了一些方法来控制记录指针的移动

除此之外,Java的处理流通过增加缓冲的方式来提高了输出输出的效率,并且提供了一系列便捷的方法来一次性输入/输出大量的内容,而不仅仅是字节或字符;处理流可以加在任何已经存在的流的基础之上,这样应用程序就可以采用相同的代码和透明的方式来访问不同的输入/输出设备的数据流,因此程序就无需关心输入/输出节点是磁盘、网络还是其他的输入/输出设备,程序只需要将这些节点流包装成处理流,便可以使用相同的输入/输出代码来读写不同的输入/输出设备的数据

猜你喜欢

转载自blog.csdn.net/dawei_yang000000/article/details/106036311