javajavase
IO是Input/Output的缩写,IO技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等

  • Java程序中,对于数据的输入输出操作以“流(stream)”的方式进行
  • Java.IO包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据

    Java IO原理

  • 输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中

  • 输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中

image.png

流的分类

按流的方向

  • 输入流:数据流向是数据源到程序(以InputStream、Reader结尾的流)
  • 输出流:数据流向是程序到目的地(以OutPutStream、Writer结尾的流)

按处理的数据单元

  • 字节流:以字节为单位获取数据,命名上以Stream结尾的流一般是字节流
  • 字符流:以字符为单位获取数据,命名上以Reader/Writer结尾的流一般是字符流

按处理对象不同

  • 节点流:可以直接从数据源或目的地读写数据

IO流原理及分类 - 图2

  • 处理流:不直接连接到数据源或目的地,是”处理流的流”。通过对其他流的处理提高程序的性能,处理流也叫包装流

IO流原理及分类 - 图3

IO流体系

image.png
Java的IO流共涉及40多个类,实际上非常规则,都是从如下4个抽象基类派生的
由这四个类派生出来的子类名称都是以其父类名作为子类名后缀
image.png
几个常用的IO流结构

** 节点流(或文件流) 缓冲流(处理流的一种)
InputStream FileInputStream (read(byte[] buffer)) BufferedInputStream (read(byte[] buffer))
OutputSteam FileOutputStream(write(byte[] buffer,0,len) BufferedOutputStream (write(byte[] buffer,0,len) / flush()
Reader FileReader (read(char[] cbuf)) BufferedReader (read(char[] cbuf) / readLine())
Writer FileWriter (write(char[] cbuf,0,len) BufferedWriter (write(char[] cbuf,0,len) / flush()

InputSteam & Reader

InputStream 和 Reader 是所有输入流的基类
FileInputStream 用于读取非文本数据之类的原始字节流,要读取字符流,需要使用 FileReader
程序中打开的文件IO资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该显式关闭文件IO资源

InputSteam

**int read()**

  • 读取一个字节的数据并将字节的值作为int类型返回(0-255之间)。如果未读出字节则返回-1表示读取结束(汉字是两个字节,现在读取一个字节就转换为char输出,会出现乱码题)

**int read(byte[] b)**

  • 从该输入流读取最多b.length个字节的数据(字节数组)并将它存到数组b中返回读取字节长度,如果返回-1说明已经读到文件末尾

**int read(byte[] b,int off,int len)**

  • 将输入流中最多len个数据字节读入byte数组。尝试读取len个字节(读取的字节也可能小于该值),以整数形式返回实际读取的字节数。如果返回-1说明已经读到文件末尾

**public void close() throws IOException**

  • 关闭此输入流并释放与该流关联的所有系统资源

    Reader

    **int read()**

  • 读取一个字符的数据并将字符的值作为int类型返回(0-65535之间的一个Unicode值)。如果未读出字符则返回-1(表示读取结束)

**int read(char[] cbuf)**

  • 将字符读入数组。如果已到达流的末尾,则返回-1。否则返回本次读取的字符数

**int read(char[] cbuf,int off,int len)**

  • 将字符读入数组的某一部分。存到数组cbuf中,从off处开始存储,最多读len个字符。如果已到达流的末尾,则返回-1。否则返回本次读取的字符数

**public void close() throws IOException**

  • 关闭此输入流并释放与该流关联的所有系统资源

    OutputSteam & Writer

    OutputStream 和 Writer 是所有输出流的基类
    FileOutputstream 用于写出非文本数据之类的原始字节流,要写出字符流需要使用 FileWriter
    因为字符流直接以字符作为操作单位,所以 Writer 可以用字符串来替换字符数组,即以String对象作为参数

    OutputStream

    **void write(int b)**

  • 将指定的字节写入此输出流。 write的常规协定是:向输出流写入一个字节。要写入的字节是参数b的八个低位。b的24个高位将被忽略。即写入0~255范围的

**void write(byte[] b)**

  • 将b.length个字节从指定的byte数组写入此输出流。write(b)与调用wite(b, 0, b.length)的效果完全相同

**void write(byte[] b,int off,int len)**

  • 将指定byte数组中从偏移量off开始的len个字节写入此输出流

**public void flush() throws IOException**

  • 刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示应将这些字节立即写入它们预期的目标

**public void close() throws IOException**

  • 关闭此输岀流并释放与该流关联的所有系统资源

    Writer

    **void write(int c)**

  • 写入单个字符。要写入的字符包含在给定整数值的16个低位中,16高位被忽略。即写入0到65535之间的 Unicode码

**void write(char[] cbuf)**

  • 写入字符数组

**void write(char[] cbuf,int off,int len)**

  • 写入字符数组的某一部分。从off开始,写入len个字符

**void write(String str)**

  • 写入字符串

**void write(String str,int off,int len)**

  • 写入字符串的某一部分

**void flush()**

  • 刷新该流的缓冲,则立即将它们写入预期目标

**public void close() throws IOException**

  • 关闭此输出流并释放与该流关联的所有系统资源

    输入、输出标准化过程

    输入过程
  1. 创建File类的对象,指明读取的数据的来源(要求此文件一定要存在)
  2. 创建相应的输入流,将File类的对象作为参数,传入流的构造器中
  3. 具体的读入过程:创建相应的byte[] 或 char[]
  4. 关闭流资源

说明:程序中出现的异常需要使用try-catch-finally处理

输出过程

  1. 创建File类的对象,指明写出的数据的位置(不要求此文件一定要存在)
  2. 创建相应的输出流,将File类的对象作为参数,传入流的构造器中
  3. 具体的写出过程:write(char[]/byte[] buffer, 0, len)
  4. 关闭流资源

说明:程序中出现的异常需要使用try-catch-finally处理