Java I/O流详解

By | 2016年3月31日 | 阅读:282 次

总结一下Java的常用I/O API及其关系

P1. Java I/O处理概述

P2. Java中的流家族的类继承与接口实现关系


P1. Java I/O处理概述


I/O流

  1. IO分类
    • 按数据处理方式分 :字节流 & 字符流
    • 按数据起点终点分 :输入流 & 输出流
  2. 字符流 & 字节流
    • 字符流:以16 bits(2 bytes)即字符单位读入或写出,处理类继承自abstract类 Reader 和 Writer
      • 字符流只能处理字符类型数据
      • Java对Unicode字符采用UTF-16编码,一个Unicode字符(代码点)由1或2个char(代码单元)表示
      • 字符流本质是对字节流的读取,由对应码表转换,操作字符更高效高速
    • 字节流:以8 bits(1 byte)读入或写出,处理类继承自类 InputStream 和 OutputStream
      • 读入或写出到指定位置1字节数据,能处理所有类型数据(数据在底层均为二进制存储)
    • 建议:纯文本(完全可由unicode编码)读入和写出应该用字符流,其余数据(视频音频图片等)应该用字节流
  3. 输入流 & 输出流
    • 输入流只能读入,输出流只能写出
    • Ps: 读入和写出是本程序相对于流而言,并不矛盾

P2. Java中的流家族的类继承与接口实现关系如下图:

Image from: Java IO stream structure


P2.1 字节输入流InputStream

  • java.io.InputStream
  • public abstract class InputStreamextends Object implements Closeable
  • abstract methods :
    • public abstract int read() throws IOException // 从输入流中读取数据的下一个字节,返回 0 到 255 范围内的 int 字节值,若到达流末尾返回 -1,在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞
  • InputStream抽象类是所有表示字节输入流类的父类,常用字节输入流子类有2个 : ByteArrayInputStream、FileInputStream

P2.1.1 ByteArrayInputStream : 包含一个内部缓冲区,该缓冲区包含从流中读取的字节 (byte[])
  • constructors :
    • public ByteArrayInputStream(byte[] buffer); // 创建ByteArrayInputStream实例,使用 buffer作为其缓冲区字节数组
    • public ByteArrayInputStream(byte[] buffer, int offset, int length); // offset : 缓冲区中要读取的第一个字节的偏移量,length 从缓冲区中读取的字节数
  • methods :
    • public int available(); // 返回可从此输入流读取的剩余字节数: count – pos (count 的初始值是 offset+length 和 buffer.length 中的最小值)
    • public void close() throws IOException // 关闭 ByteArrayInputStream 无效,关闭后此流后仍可被调用,发生 I/O 错误抛出IOException
P2.1.2 FileInputStream : 从文件系统中的某个文件中获得输入字节,用于读取诸如图像数据之类的原始字节流
  • constructors :
    • public FileInputStream(String name) throws FileNotFoundException // 通过打开指定路径文件的连接来创建 FileInputStream,该文件的路径名由与系统有关的文件名 name 指定,若指定文件不存在,或是一个目录,或因为其他原因无法读取,抛出FileNotFoundException
    • public FileInputStream(File file) throws FileNotFoundException // 通过打开到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象指定
  • methods :
    • public int read() throws IOException // 从此输入流中读取一字节,若没有输入可用,则此方法将阻塞,返回下一个数据字节;若已到达文件末尾,返回 -1
    • public int read(byte[] b) throws IOException // 从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中
    • public void close() throws IOException // 关闭此文件输入流并释放与此流有关的所有系统资源,如果此流有一个与之关联的通道,则关闭该通道

P2.2 字节输出流OutputStream

  • java.io.OutputStream
  • public abstract class OutputStreamextends Objectimplements Closeable, Flushable
  • abstract methods :
    • public abstract void write(int b) throws IOException // 将指定的字节b写入输出流,写入的字节是 b 的8个低位,b 的 24 个高位将被忽略。
      OutputStream 的子类必须提供此方法的实现。
  • OutputStream抽象类是所有表示字节输出流类的父类,常用字节输入流子类有 : ByteArrayOutputStream、FileOutputStream

P2.2.1 ByteArrayOutputStream : 实现一个输出流,数据被写出到一个 byte 数组,缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据
  • constructors :
    • public ByteArrayOutputStream() // 创建一个新的 byte 数组输出流。缓冲区容量最初是 32 字节,有必要可增加大小
    • public ByteArrayOutputStream(int size) // 创建一个新的 byte 数组输出流,指定缓冲区容量大小为 size bytes
  • methods :
    • public int size() // 返回缓冲区的当前大小 count(输出流中有效字节的数目)
    • public String toString() // 使用平台默认字符集解码缓冲区字节数据为字符串,新 String 的长度与平台字符集有关,可能不等于缓冲区的大小
    • public String toString(String charsetName) throws UnsupportedEncodingException // 使用指定的 charsetName解码字节数据
P2.2.2 FileOutputStream : 文件输出流用于写入诸如图像数据之类的原始字节流到 File
  • constructors :
    • public FileOutputStream(File file) throws FileNotFoundException // 创建向 File 对象文件中写入数据的文件输出流
    • public FileOutputStream(File file, boolean append) // append – 为 true则将字节写入文件末尾,false则写入文件开始处

2 thoughts on “Java I/O流详解

Comments are closed.