logo头像
ICQL

220_javase-bio

BIO类概述

  • 输入输出:站在内存的角度来讲的,input输入代表输入到内存中,output输出代表从内存中输出
  • 流:流从概念上来说是一个连续的数据流。你既可以从流中读取数据,也可以往流中写数据。流与数据源或者数据流向的媒介相关联。在Java IO中流既可以是字节流(以字节为单位进行读写),也可以是字符流(以字符为单位进行读写)
  • 可以根据处理的数据是二进制数据还是字符数据来选择使用 字节流bytes 或者 字符流char

字节流:输入流(包含继承关系)

  • InputStream(抽象类,所有的输入字节流的父类)

    • FileInputStream(基本介质流,从 本地文件 读取数据)
    • ByteArrayInputStream(基本介质流,从 内存中Byte数组 读取数据)
    • StringBufferInputStream(基本介质流,Deprecated,从 内存中字符串 读取数据)
    • SequenceInputStream(合并流)
    • PipedInputStream(管道流,从与其它线程共用的管道中 读取数据)
    • ObjectInputStream(序列化流)
    • FilterInputStream(装饰流)
      • BufferedInputStream(装饰流)
      • DataInputStream(装饰流)
      • LineNumberInputStream(装饰流)
      • PushbackInputStream(装饰流)
  • 基本输入字节流

    • FileInputStream(基本介质流,从 本地文件 读取数据)
      • 功能:最基本的文件输入流。主要用于从文件中读取信息
      • 构造:通过一个代表文件路径的 String、File对象或者 FileDescriptor对象创建
      • 使用:一般作为数据源,同样会使用其它装饰器提供额外的功能
    • ByteArrayInputStream(基本介质流,从 内存中Byte数组 读取数据)
      • 功能:将内存中的Byte数组适配为一个InputStream
      • 构造:从内存中的Byte数组创建该对象(2种方法)
      • 使用:一般作为数据源,会使用其它装饰流提供额外的功能,一般都建议加个缓冲功能
    • StringBufferInputStream(基本介质流,从 内存中字符串 读取数据)
      • 功能:将内存中的字符串适配为一个InputStream
      • 构造:从一个String对象创建该对象,底层的实现使用StringBuffer,Deprecated,主要原因是StringBuffer不应该属于字节流,所以推荐使用StringReader
    • SequenceInputStream(合并流)
      • 功能:将2个或者多个InputStream 对象转变为一个InputStream
      • 构造:使用两个InputStream 或者内部对象为InputStream 的Enumeration对象创建该对象
      • 使用:一般作为数据源,同样会使用其它装饰器提供额外的功能
  • 管道输入字节流

  • 序列化输入字节流 http://ifeve.com/java-io-s-objectinputstream-objectoutputstream/

    • transient 关键字 修饰不想被序列化的字段
  • 装饰输入字节流

    • FilterInputStream(装饰流,给其它被装饰对象提供额外功能的抽象类)
      • BufferedInputStream(装饰流)
        • 功能:使用该对象阻止每次读取一个字节都会频繁操作IO。将字节读取到一个缓冲区,从缓冲区读取,缓冲区是其内部维护一个字节数组,默认大小是 byte[8*1024] 8kb大小,而从底层流中读取数据的操作还是调用InputStream的方法完成
        • 构造:利用一个InputStream、或者带上一个自定义的缓存区的大小构造
        • 使用:使用InputStream的方法读取,只是背后多一个缓存的功能。设计模式中透明装饰器的应用
      • DataInputStream(装饰流)
        • 功能:一般和DataOutputStream配对使用,完成基本数据类型的读写
        • 构造:利用一个InputStream构造
        • 使用:提供了大量的读取 基本数据类型 的读取方法
      • LineNumberInputStream(装饰流)
        • 功能:跟踪输入流中的行号。可以调用getLineNumber( ) 和 setLineNumber(int)方法得到和设置行号
        • 构造:利用一个InputStream构造
        • 使用:紧紧增加一个行号,可以像使用其它InputStream一样使用
      • PushbackInputStream(装饰流)
        • 功能:可以在读取最后一个byte 后将其放回到缓存中
        • 构造:利用一个InputStream构造
        • 使用:一般仅仅会在设计 compiler 的 scanner 时会用到这个类,一般用不到

字节流:输出流(包含继承关系)

  • OutputStream(抽象类,所有的输出字节流的父类)

    • FileOutputStream(基本介质流,向 本地文件 写入数据)
    • ByteArrayOutputStream(基本介质流,向 内存中Byte数组 写入数据)
    • PipedOutputStream(管道流,向 与其它线程共用的管道中 写入数据)
    • ObjectOutputStream(序列化流)
    • FilterOutputStream(装饰流)
      • BufferedOutputStream(装饰流)
      • DataOutputStream(装饰流)
      • PrintStream(装饰流)
  • 基本输出字节流

    • FileOutputStream(基本介质流,向 本地文件 写入数据)
      • 功能:将信息写入文件中
      • 构造:使用代表文件路径的String、File对象或者 FileDescriptor 对象创建。还可以加一个代表写入的方式是否为append的标记
      • 使用:一般将其和FilterOutputStream套接得到额外的功能
    • ByteArrayOutputStream(基本介质流,向 内存中Byte数组 写入数据)
      • 功能:在内存中创建一个缓冲区buffer。所有写入此流中的数据都被放入到此buffer中
      • 构造:无参或者使用一个可选的初始化buffer的大小的参数构造
      • 使用:一般将其和 FilterOutputStream 套接得到额外的功能。建议首先和 BufferedOutputStream 套接实现缓冲功能。通过 toByteArray 方法可以得到流中的数据。(不透明装饰器的用法)
  • 管道输出字节流

  • 序列化输出字节流 http://ifeve.com/java-io-s-objectinputstream-objectoutputstream/

  • 装饰输出字节流

    • FilterOutputStream(装饰流,给其它被装饰对象提供额外功能的抽象类)
      • BufferedOutputStream(装饰流)
        • 功能:使用它可以避免频繁地向IO写入数据,数据一般都写入一个缓存区,在调用flush方法后会清空缓存、一次完成数据的写入
        • 构造:从一个 OutputStream 或者和一个代表缓存区大小的可选参数构造
        • 使用:提供和其它OutputStream一致的接口,只是内部提供一个缓存的功能
      • DataOutputStream(装饰流)
        • 功能:通常和DataInputStream配合使用,使用它可以写入基本数据类型
        • 构造:使用OutputStream构造
        • 使用:包含大量的写入基本数据类型的方法
      • PrintStream(装饰流)
        • 功能:产生具有格式的输出信息
        • 构造:使用OutputStream和一个可选的表示缓存是否在每次换行时是否flush的标记构造。还提供很多和文件相关的构造方法
        • 使用:一般是一个终极(“final”)的包装器,很多时候我们都使用它

字节流:输入与输出的对应

  • 字节流的输入和输出大部分一一对应
  • 不太对称的几个类
    • LineNumberInputStream:主要完成从流中读取数据时,会得到相应的行号,至于什么时候分行、在哪里分行是由该类主动确定的,并不是在原始中有这样一个行号。在输出部分没有对应的部分,我们完全可以自己建立一个LineNumberOutputStream,在最初写入时会有一个基准的行号,以后每次遇到换行时会在下一行添加一个行号,看起来也是可以的,此类作用不大
    • PushbackInputStream:主要功能是查看最后一个字节,不满意就放入缓冲区。主要用在编译器的语法、词法分析部分。输出部分的BufferedOutputStream几乎实现相近的功能
    • StringBufferInputStream:已经被Deprecated,本身就不应该出现在InputStream部分,主要因为String应该属于字符流的范围。已经被废弃了,当然输出部分也没有必要需要它了,还允许它存在只是为了保持版本的向下兼容而已
    • SequenceInputStream:可以认为是一个工具类,将两个或者多个输入流当成一个输入流依次读取
    • PrintStream:也可以认为是一个辅助工具。主要可以向其他输出流,或者FileInputStream写入数据,本身内部实现还是带缓冲的。本质上是对其它流的综合运用的一个工具而已。System.out和System.err就是PrintStream的实例
  • ObjectInputStream/ObjectOutputStream和DataInputStream/DataOutputStream主要是要求写对象/数据和读对象/数据的次序要保持一致,否则轻则不能得到正确的数据,重则抛出异常(一般会如此)
  • PipedInputStream/PipedOutputStream在创建时一般就一起创建,调用它们的读写方法时会检查对方是否存在,或者关闭!道理极其简单――对方都不在了,怎么交互

字符流:输入流(包含继承关系)

  • Reader(抽象类,所有的输入字符流的父类)
    • InputStreamReader(是一个连接字节流和字符流的桥梁,它将字节流转变为字符流),实例化Reader的子类时一般要用它
      • FileReader(文件流)
    • CharArrayReader(基本介质流,从 内存中Char数组 读取数据)
    • StringReader(基本介质流,从 内存中字符串 读取数据)
    • PipedReader(管道流)
    • BufferedReader(装饰流,经常用)
    • FilterReader(装饰流)
      • PushbackReader

字符流:输出流(包含继承关系)

  • Writer(抽象类,所有的输入字符流的父类)
    • OutputStreamWriter(是一个连接字节流和字符流的桥梁,它将字节流转变为字符流),实例化Writer的子类时一般要用它
      • FileWriter(文件流)
    • CharArrayWriter(基本介质流,从 内存中Char数组 读取数据)
    • StringWriter(基本介质流,从 内存中字符串 读取数据)
    • PipedWriterr(管道流)
    • BufferedWriter(装饰流)
    • PrintWriter(装饰流,经常用)
    • FilterWriter(装饰流)
微信打赏

赞赏是不耍流氓的鼓励