流的分类
一、流分类
1、按方向:输入流、输出流
2、按处理的最小单元划分:字节流(byte)、字符流(char)
3、按照是否直接和目标接触划分:节点流,处理流
(一)、流的分类

  • 1.输入流和输出流
    按照流的流向来分,可以分为输入流和输出流。输入、输出都是从程序运行所在内存的角度来划分的。
  • 输入流:只能从中读取数据,而不能向其写入数据。由InputStream和Reader作为基类
  • 输出流:只能向其写入数据,而不能从中读取数据。由OutputStream和Writer作为基类
  • 2.字节流和字符流
    字节流和字符流的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同。
  • 字节流操作的数据单元是字节byte,由InputStream和OutputStream作为基类。
  • 字符流操作的数据单元是字符char,由 Reader和 Writer作为基类。
  • 3.节点流和处理流
    按照流的角色来分,可以分为节点流和处理流。
  • 节点流:可以从向一个特定的IO设备(如磁盘、网络)读/写数据的流。
  • 处理流:用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能。
  • 使用处理流的优势:
  1. 对开发人员来说,使用处理流进行输入/输出操作更简单;
  2. 使用处理流的执行效率更高。
    二、流的概念模型
    Java的IO流共涉及40多个类,这些类看上去芜杂而凌乱,但实际上非常规则,
    而且彼此之间存在非常紧密的联系Java的IO流的40多个类都是从如下4个抽象基类派生的。
  • InputStream/Reader:所有输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流
    对于InputStream和Reader而言,它们把输入设备抽象成一个“水管”,这个水管里的每个“水滴”依次排列:
    对于OutputStream和Writer而言,它们同样把输出设备抽象成一个“水管”,只是这个水管水滴的方向不同。
    字节流
    字节流和字符流的操作方式几乎完全一样,区别只是操作的数据单元不同而已。
    字节流操作的数据单元是字节,字符流操作的数据单元是字符。

(一)、InputStream

InputStream和Reader是所有输入流的抽象基类,它们的方法是所有输入流都可使用的方法。
InputStream类的方法

修饰符/返回值类型

方法名

说明

int

available()

返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。

void

close()

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

void

mark(int readlimit)

在此输入流中标记当前的位置。

boolean

markSupported()

测试此输入流是否支持 mark 和 reset 方法。

abstract int

read()

从输入流中读取数据的下一个字节。

int

read(byte[] b)

从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。

int

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

将输入流中最多 len 个数据字节读入 byte 数组。

void

reset()

将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。

long

skip(long n)

跳过和丢弃此输入流中数据的 n 个字节。