- 常见流
- 流的分类
- 节点流
- 处理流
- 流之间的关系
- 流的基本操作
- 读操作
- 写操作
- mark、reset 操作
- 检测、判断
- 通道
- 参考资料
| 分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
|---|---|---|---|---|
| 流-抽象基类 | InputStream | OutputStream | Reader | Writer |
| 节点流(文件流) | FileInputStream RandomAccessFile | FileOutputStream RandomAccessFile | FileReader | FileWriter |
| 节点流(数组流) | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
| 节点流(管道流) | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
| 节点流(字符流) | StringReader | StringWriter | ||
| | | | | |
| 处理流-抽象基类 | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter |
| 缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
| 转换流 | InputStreamReader | OutputStreamWriter | ||
| 数据流 | DataInputStream | DataOutputStream | ||
| 格式化输出流 | PrintStream | PrintWriter | ||
| 对象流 | ObjectInputStream | ObjectOutputStream | ||
| 序列流 | SequenceInputStream | |||
| Parsing | PushbackInputStream StreamTokenizer | PushbackReader LineNumberReader |
★
流的分类| 分类方式 | 说明 |
|---|---|
| 顶层规划 | 抽象基类:作为所有流的抽象基类,定义流操作的API接口; 功能流抽象基类:啥都没做,所有方法直接调用父类。设计意图:作为所有功能类的基类,大它都继承它去扩展。 |
| 按方向 | 输入流:将数据读进内存; 输出流:从内存当数据向外写出到目标位置。如:磁盘、网络。 |
| 按数据类型 | 字节流:读写字节数据; 字符流:读写字符数据。(底层还是字节流) |
| 按功能 | 节点流:从特定数据源读写数据; 处理流:为节点流添加具体的处理能力。 |
- 文件流:从文件生成流。
- 随意读写文件流:从文件生成流,并且能读能写,随便指定读写从哪开始。
- 数组流:从数组生成流。
- 管道流:从管道生成流。
- 字符流:其源为一个字符串的字符流。为字符串提供流式读写的能力。
- 包装流(缓冲流、处理流):封装抽象基类流的实现。
- 默认带一个8192的字节或字符数组作为缓冲区。
- 继承处理流-抽象基类,并且包装一个流-抽象基类的实现类。
- 因为有缓冲区,获得mark、reset能力。
- 转换流:把字符流封装为字符流,此过程可以指定字符集。
- 其他处理流:针对具体功能的处理。
- 从流的名字可以看出:大多数流有方向。很多流是成对出现的,它们经常会配合使用。
- 从设计角度看,类之间通过层层包装来针对具体需求增强功能
- 常规读字节我们一般用BufferedInputStream。
FileInputStream fis = new FileInputStream("E:\in.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
- 常规读字符我们一般用BufferedReader。
FileInputStream fis = new FileInputStream(new File("E:\in.txt"));
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr);
流的基本操作
读操作
流-抽象基类InputStreamorOutputStream定义的标准读操作所有读取流都支持。
其他处理流,不过是在此基础上提供针对特定操作的便捷方法。比如:ObjectInputStream支持按类型读取变量。BufferedReader支持按行读取。
| 操作 | 说明 |
|---|---|
| abstract int read() | 从输入流中读取数据的下一个字节/字符。 |
| int read(T[] b) | 从输入流中读取一定数量的字节/字符,并将其存储在缓冲区数组 b 中。 |
| int read(T[] b, int off, int len) | 将输入流中最多 len个数据字节/字符读入数组。 |
| 操作 | 说明 |
|---|---|
| abstract void write(int b) | 将指定的字节/字符写入此输出流。 |
| void write(byte[] b) | 将 b.length 个字节从指定的 字节/字符 数组写入此输出流。 |
| void write(byte[] b, int off, int len) | 将指定 字节/字符 数组中从偏移量 off 开始的 len 个字节写入此输出流。 |
| void flush() | 刷新此输出流并强制写出所有缓冲的字节/字符。 |
mark、reset 是针对缓冲区来工作的,所以只有存在缓冲区的流才可能支持此操作。
| 操作 | 说明 |
|---|---|
| void mark(int readlimit) | 在此输入流中标记当前的位置。 |
| void reset() | 将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。 |
| boolean markSupported() | 测试此输入流是否支持 mark 和 reset 方法。 |
| long skip(long n) | 跳过和丢弃此输入流中数据的 n 个字节/字符。 |
| 操作 | 说明 |
|---|---|
| int available() | 返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节/字符数。 |
| void close() | 关闭此输入流并释放与该流关联的所有系统资源。 关闭外层流会自动关闭它包装的内层流。 其实Java7之后,建议直接放 try(Closeable) 里。 |
笑虾:Java 学习笔记 - 文件IO篇:读写文本文件txt
笑虾:Java 学习笔记 - 复制文件



