IO流(0)

所谓input/output,本质上就是将数据从buffer中移动的过程。buffer指用户空间中用于程序使用的内存。

  • 从buffer中取出数据的过程称为output,也称为写操作;
  • 将数据装进buffer的过程称为input,也称为读操作。

Java将计算机中输入输出的操作抽象为流,也就是IO流。

一、基本概念和分类

io流将数据比作流,从源头一直到目的地。由前述可以得知,输出的源头和输入的源头一定是buffer。

根据操作对象的不同,我们可以将流定义分为节点流和处理流。其中节点流直接作用于节点,沟通buffer与节点之间的数据,从特定的数据源(节点)读写数据。节点可以为文件,内存数组,字符串以及管道。而处理流则作用于节点流或者处理流,主要用于对已存在的流上的数据处理,实现更复杂强大的读写功能。

根据流的方向,我们可以将流划分为输入流和输出流。输入流即数据流入buffer,输出流即数据流出buffer。

根据流处理的数据形式,我们还可以将流划分为字节流和字符流。字节流可以用于处理所有形式的数据,因为数据本身就是以字节的形式存放,而字符流则用于处理字符数据,本质上还是操作字节数据,只不过通过编码方式对字节进行了转换处理。

二、字节流vs字符流

根据处理数据类型的不同,流分为字节流和字符流。

  • 字节流与字符流的读写单位不同,字节流一次读取一个字节,而字符流一次读取一个字符(多个字节)
  • 处理的对象不同,字符流主要处理文本等字符类型的数据,而字节流可以处理所有类型的数据,常见的如图片,音视频,文件等等

在java中,字节流的两个抽象类为InputStream和OutputStream,类名后缀为这两者的子类都是字节流的实现,如FileInputStream/FileOutputStream。

字符流的两个抽象类为Reader和Writer,同理类名后缀为这两者的子类都是字符流的实现,如FileReader/FileWriter。

三、输入流vs输出流

按照流的方向,我们通常分为输入流和输出流。以程序内存为基准:

  • 流入内存的为输入流
  • 流出内存的为输出流

常见的输入流是InputStream或者Reader的子类,输出流是OutputStream或者Writer的子类。

四、节点流vs处理流

根据处理对象的不同,我们把流分为节点流和处理流。节点流沟通节点与程序,在Java中节点主要有:文件、内存数组、内存字符串、管道。因此对应的节点流分别为:

  • 文件:FileReader/FIleWriter、FileInputStream/FileOutputStream
  • 内存数组:CharArrayReader/CharArrayWriter、ByteArrayInputStream/ByteArrayOutputStream
  • 内存字符串:StringReader/StringWriter
  • 管道:PipedReader/PipedWriter、PipedInputStream/PipedOutputStream

这些节点流的构造器中需要指定节点对象。如文件流则需要指定文件对象:

public FileReader(File file) throws FileNotFoundException {
    super(new FileInputStream(file));
}

处理流的处理对象则是节点流或者处理流。它的任务主要是在已有的流的基础上,对数据进行特定的处理,从而实现更高级的读写功能。根据功能分类,处理流分为:

  • 缓冲流。BufferedReader/BufferedWriter、BufferedInputStream/BufferedOutputStream。基本流在读写操作时,一次只能读写一个单位的数据,如字节流一次读写一个字节,字符流一次读写一个字符。为减少IO次数,设计缓冲流将数据缓冲起来,然后进行批量的读写。
  • 过滤流。FilterInputStream/FilterOutputStream、FilterReader/FilterWriter。用于封装基本的输入输出流,该类的子类可以实现对输入流的封装,如缓冲流BufferedInputStream/BufferedOutputStream就是过滤流的子类。
  • 转换流。InputStreamReader/OutputStreamWriter。转换流用于将字节流包装成字符流,接收InputStream/OutputStream类型的字节流,构造字符流。
  • 对象流。ObjectInputStream/ObjectOutputStream。用于读写对象到字节流,一般我们的数据都是文本数据或者是文件数据读写,有了对象流,我们可以向字节流里读写对象,实现对象的持久化。这里需要注意的是,读写的对象必须实现序列化接口。
  • 数据流。DataInputStream/DataOutputStream。数据流实现了程序以Java基本类型在字节流中进行读写的功能,如从字节流中读写boolean、int、char、double、float等数据类型的数据。
  • 打印流。PrintStream/PrintWriter。是过滤流的一种实现,对输出流进行包装,除了可以完成基本输出流的工作,还提供打印的功能,如System.out就是PrintStream的实例。

处理流在构造的时候需要指定节点流或者其他处理流作为参数。不能直接作用于节点上。

posted @ 2019-06-20 17:29  sxzheng  阅读(262)  评论(0编辑  收藏  举报