理解JAVA的IO流

File类

在程序中想要操作文件和目录,是通过File类来完成的,File类中提供是一系列的方法(查看API文档),借助File类可以完成新建、删除、重命名文件和目录,但值得注意的是File并不能访问文件中的内容。想要对访问的文件中的内容,就需要利用IO流(输入输出流)

理解JAVA的IO流
stream 流是java中对不同的输入/输出源(键盘、文件、网络连接等)的抽象表述。简单来说,可以理解为从起源(source)到接收(sink)的有序数据。


流的分类

  1. 从流向的角度来分,流分为输入流和输出流。
    输入流:只读,不写(只能从中读取数据,不能向其写数据)。
    输出流:只写,不读(只能向其写入数据,不能从中读取数据)。

  2. 从操作数据的单元不同,流分为字节流和字符流。
    字节流:操作的数据单元是8位字节
    字符流:操作的数据单元是16位的字符

  3. 从流的角色来分,流分为节点流和处理流。
    节点流(也称低级流):程序从/向特定的IO设备(如磁盘、网络)读/写数据。
    这里写图片描述

    • 处理流(也称高级流、包装流):对一个已经存在的流进行连接或封装,程序通过封装后的流来进行数据的读/写。
      这里写图片描述
      . 节点流就相当于用一根特定的水管从数据源端伸出(不同的处理流,对应不同的大小的水管),从程序直接连接到实际的数据源,程序和实际的输入/输出节点是直接连接上的,此时通过这特定的水管程序只能访问一个特定的数据源。但处理流则是在程序端加入了一个转接水管,根据数据源端的水管的大小在外面套上一个转接水管(也就是对节点流进行了封装),然后再接到程序,这样使用的优点就是,只要使用相同的处理流(也就是数据源端的水管大小一样),程序就可以采用完全相同的输入/输出代码(一个对应大小固定的转接水管)来访问不同的数据源。(使用处理流来包装节点流其实是一种典型的装饰器设计模式。)
      . 使用处理流的思路:使用处理流来包装节点流,程序通过处理流来执行输入/输出功能,让节点流与底层的IO设备、文件交互。
      . 识别处理流和节点交:只要流的构造器的参数不是一个物理节点,而是已经存在的流,那么这种流就一定是处理流;而所有节点流都是直接以物理IO节点作为构造器参数的。例如:
...
    //以一个文本,即物理节点作为构造器参数,FileOutputStream 是节点流
    FileOutputStream fos = new FileOoutputStream("test.txt");
    //以一个流作为构造器参数,PrintStream 是处理流
    PrintStream ps = new PrintStream(fos);
...

IO流的体系

这里写图片描述

  • Java中的IO流有将近40个类,但所有的IO流都是从四个基类中扩展出来的。
    InputStream/Reader: 是所有输入流的基类,前者是字节输入流,后者是字符输入流。
    OutputStram/Writer:是所有输出流的基类,前者是字节输出流,后者是字符输出流。
  • 选择的规则:内容是文本内容,使用字符流;内容是二进制内容,则使用字节流。
    (附:在计算机中,文件可以分为文本文件和二进制文件,所以能用记事本打开关查看到其中的字符内容的文件都是文本文件,反之则是二进制文件。实质上,计算机中所有文件都是二进制文件,文本文件只是二进制文件的特例:当二进制文件里的内容恰好能被正常解析成字符时,二进制文件也就成了文本文件。)

本文参考了李刚《疯狂Java讲义》一书。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章