Java IO流(一)入门

#io流分类
关于各种流的名称解释 (当我们讨论流的输入和输出都是以程序(内存)为视角来看数据的流动方向)

  • 输出流: 输出流是指数据从程序(内存)写到其他地方,比如文件或者网络
  • 输入流: 输入流是指数据从其他地方(文件或网络)读到程序(内存)中

(按流处理数据类型定义) 1Char = 2Byte,1Byte = 8bit,1Char = 16Bit

  • 字节流 读取或写入数据时,按字节为单位处理
  • 字符流 读取或写入数据时,按字符为单位处理

(按作用方式)

  • 节点流: 直接作用于需要处理的文件
  • 处理流: 需要节点作流为上游,目的是增加处理性能或灵活性

java里面Io流很多,乍一看很吓人,其实它们都是由4个基础抽象类演变而来(不能直接使用,实际处理流功能需调用子类实现)

  • InputStream 字节输入流抽象类
  • OutputStream 字节输出流抽象类
  • Reader 字符输入流抽象类
  • Writer 字符输出流抽象类


看到这么多流,咱们别害吧,一遍遍查查手册,看看

字节输入流家族

  • InputStream:字节输入流基类,是所有的字节输入流的父类,它是一个抽象类。

  • FileInputSream:文件输入流。它通常用于对文件进行读取操作。

  • FilterInputStream :过滤流。作用是为基础流提供一些额外的功能。装饰者模式中处于装饰者,具体的装饰者都要继承它,所以在该类的子类下都是用来装饰别的流的,也就是处理类。

  • BufferedInputStream:缓冲流。对处理流进行装饰,增强,内部会有一个缓存区,用来存放字节,每次都是将缓存区存满然后发送,而不是一个字节或两个字节这样发送。效率更高。

  • DataInputStream:数据输入流。它是用来装饰其它输入流,它“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”。

  • PushbakInputStream:回退输入流。java中读取数据的方式是顺序读取,如果某个数据不需要读取,需要程序处理。PushBackInputStream就可以将某些不需要的数据回退到缓冲中。

  • ObjectInputStream:对象输入流。用来提供对“基本数据或对象”的持久存储。通俗点讲,也就是能直接传输对象(反序列化中使用)。

  • PipedInputStream:管道字节输入流。它和PipedOutputStream一起使用,能实现多线程间的管道通信。

  • SequenceInputStream:合并输入流。依次将多个源合并成一个源。

  • StringBufferInputStream:字符相关流。已经过时不多说。

  • ByteArrayInputStream:字节数组输入流,该类的功能就是从字节数组(byte[])中进行以字节为单位的读取,也就是将资源文件都以字节的形式存入到该类中的字节数组中去,我们拿也是从这个字节数组中拿。

字节输出流家族

  • OutputStream:字节输出流基类,是所有的字节输出流的父类,它是一个抽象类。

  • FileOutputStream:文件输出流。该类实现了一个输出流,将数据输出到文件。

  • FilterOutputStream :过滤流。用来封装其它的输出流,并为它们提供额外的功能(序列化中使用)。它主要包括BufferedOutputStream, DataOutputStream和PrintStream。

  • BufferedOutputStream:缓冲输出流。给输出流提供缓冲功能。

  • DataOutputStream:是用来装饰其它输出流,将DataOutputStream和DataInputStream输入流配合使用,“允许应用程序以与机器无关方式从底层输入流中读写基本 Java 数据类型”。

  • PrintStream:是用来装饰其它输出流。它能为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。

  • ObjectOutputStream:对象输出流。该类将实现了序列化的对象序列化后写入指定地方。

  • PipedOutputStream:管道字节输出流。它和PipedInputStream一起使用,能实现多线程间的管道通信,是管道的发送端。

  • ByteArrayOutputStream:字节数组输出流。该类实现了一个输出流,其数据被写入由byte数组充当的缓冲区,缓冲区会随着数据的不断写入而自动增长。

字符输入流家族

  • Reader:是所有的输入字符流的父类,它是一个抽象类。

  • CharReader、StringReader 是两种基本的介质流,它们分别将Char 数组、String中读取数据。

  • PipedReader 是从与其它线程共用的管道中读取数据。

  • BufferedReader是一个装饰器,它和其子类LineNumberReader负责装饰其它Reader对象。

  • InputStreamReader:是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader 可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。我们可以从这个类中得到一定的技巧。Reader 中各个类的用途和使用方法基本和InputStream 中的类使用一致。后面会有Reader 与InputStream 的对应关系。

  • FilterReader 是所有自定义具体装饰流的父类,其子类PushbackReader 对Reader对象进行装饰,会增加一个行号。

字符输出流家族

  • Writer:是所有的输出字符流的父类,它是一个抽象类。

  • CharArrayWriter、StringWriter 是两种基本的介质流,它们分别向Char 数组、String 中写入数据。PipedWriter 是向与其它线程共用的管道中写入数据,

  • BufferedWriter 是一个装饰器为Writer 提供缓冲功能。

  • PrintWriter 和PrintStream 极其类似,功能和使用也非常相似。

  • OutputStreamWriter:是OutputStream 到Writer 转换的桥梁,它的子类FileWriter 其实就是一个实现此功能的具体类(具体可以研究一SourceCode)。功能和使用和OutputStream 极其类似。

原文地址:https://www.cnblogs.com/gy1010/p/14030996.html