流 2 特殊流 3 其他流 4 特别注释

作者: insightcodeyk
出处: https://insightcodeyk.github.io/2018/03/10/Stream/
声明: 本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0,转载请注明作者及出处。

概述

流是一组有序的数据序列,有两种分类方式:

根据操作的类型,分为 输入流 和 输出流
根据传输内容类型,分为 字节流 和 字符流

1.1 字节流

以字节为传输单位的流

1.1.1 字节输入流

字节输入流超类(抽象):InputStream

总共包含9个方法,其中有3个read方法(重点: 在输入数据可用、检测到文件末尾或者抛出异常之前,read方法阻塞
分别是,
abstract int read(); 从输入流读取一个字节,返回该字节的十进制编码,结束返回-1
int read(byte[] buffer); 从输入流读取一个字节数组,返回数组中获得的字节数,结束返回-1
read方法自动检测byte[]数组长度,每次读入最多(length - 1)个字节
int read(byte[] buffer, int offser, int len); 从输入流读取一个字符数组,指定开始>和长度,结束返回 -1

1.1.1.1 字节文件输入流FileInputStream

构造方法总共三个,记录其中两个
分别是,
FileInputStream(File file); 通过一个文件对象创建字节文件流
FileInputStream(String name); 通过文件路径名创建字节文件流

1.1.1.2 字节缓冲文件输入流BufferedInputStream

建立在InputStream上,通过提供流内缓冲数组来加快传输速度.

构造方法总共两个
分别是,
BufferedInputStream(InputStream in); 在InputStream的基础上创建创建字节缓冲文件输入流
BufferedInputStream(InputStream, int size); 与以上构造方法的区别在于, size指定了流缓冲区域的大小

1.1.2 字节输出流

字节输出流超类(抽象):OutputStream

总共包含5个方法,其中有3个write方法
分别是,
absract void write(int b); 向输出流写入一个字节
void write(byte[] b); 向输出流写入b数组中从0开始b.length个字节的数据
void write(byte[] b, int off, int len); 向输出流中写入b数组中从off开始的len个字节的数据

1.1.2.1 字节文件输出流FileOutputStream

构造方法总共5个,记录4个
分别是,
FileOutputStream(File file); 通过文件对象创建字节文件输出流(每次创建清空该文件)
FileOutputStream(File file, boolean append); 同上,区别在于若append == ture,则不清空文件,并从文件末尾添加
FileOutputStream(String name); 通过文件路径名创建字节文件输出流(每次创建清空该文件)
FileOutputStream(String name, boolean append);同上,区别在于若append == ture,则不清空文件,并从文件末尾添加

1.1.2.2 字节缓冲文件输出流BufferedOutputStream

建立在OutputStream上(组合关系)的缓冲流,使用的直接目的是传输速度显著提高
重点注意之一,所有的Bufered*输出流,在调用写方法后,需要在适时的时候刷新,需要控制刷新防止最后部分数据没有被写出.

构造方法有两个
分别是,
BufferedOutputStream(OutputStream out); 创建一个缓冲输出流
BufferedOutputStream(OutputStream out, int size); 创建一个指定缓冲区大小的缓冲输出流

1.2 字符流

以字符为传输单位的流

1.2.1 字符输入流

字符输入流超类(抽象):Reader

总共有10个方法,其中read方法有4个
分别是,
abstract int read(char[] cbuf, int off, int len);将len个字符读入数组cbuff,从off开始,读到流末尾返回-1
int read();返回读取到的一个字符值,读到流末尾返回-1
int read(char[] cbuf);将字符读入数组,读入长度为cbuf.length,读到流末尾返回-1
int read(CharBuff target);试图将字符读入指定的字符缓冲区。缓冲区可照原样用作字符的存储库:所做的唯一改变是put操作的结果。不对缓冲区执行翻转或重绕操作。(没用过,复制过来jdk1.6)

1.2.1.1 字符输入流转换器InputStreamReader

将字节流转换为字符流

有4个构造方法,记录其中2个
分别是,
InputStreamReader(InputStream in); 用字节流创建默认字符集的字符流
InputStreamReader(InputStream in, String charseName); 用字节流创建指定字符集的字符流

1.2.1.2 便捷文件字符输入流FileReader

使用默认字符集构造字符输入流

总共3个构造方法,记录其中两个
分别是,
FileReader(File file); 给定文件对象创建便捷文件字符输入流
FileReader(String fileName); 给定文件路径名创建便捷文件字符输入流

1.2.1.3 缓冲字符输入流BufferedReader

Buffered:作用同上,显著提高传输速度.
重点注意之一,所有的Bufered*输出流,在调用写方法后,需要在适时的时候刷新,需要控制刷新防止最后部分数据没有被写出.
同时与以上输入流方法相比多了一个方法:
public String readLin(); 读取一行文本。以’r’, ‘n’, ‘rn’为结束标志.

总共两个构造方法,
分别是,
BufferedReader(Reader in); 创建一个使用默认大小输入缓冲区的缓冲字符输入流
BufferedReader(Reader in, int sz); 指定缓冲去大小,其他同上一个方法相同

1.2.2 字符输出流

字符输出流超类(抽象):Writer

1.2.2.1 字符输出流转换器OutputStreamWriter

将字节流转换为字符流

有4个构造方法,记录其中2个
分别是,
OutputStreamWriter(OutputStream out); 用默认字符集字节流创建字符输出流
OutputStreamWriter(OutputSteam out, String charsetName); 指定字符集,用字节流创建字符流

1.2.2.2 便捷文件字符输出流FileWriter

所谓便捷指的是创建便捷,不用自己指定字符集以及缓冲区(流缓冲区)

总共有5个构造方法,记录其中4个
分别是,
FileWriter(File file); 通过文件对象构造(首次写出,清空对应文件)
FileWriter(File file, boolean append); 与上区别在于,append若为true,则向文件末尾开始添加
FileWirter(String fileName);通过文件路径名构造,其他相同
FileWirter(String fileNmae, boolean append);通过文件路径名构造,其他相同

1.2.2.3 缓冲字符输出流BufferedWriter

缓冲的作用和上文相同

总共2个构造方法,
分别是
BufferedWriter(Writer out); 使用默认大小的输出缓冲区的缓冲字符输出流
BufferedWriter(Writer out, int sz); 同上的区别在于:使用给定大小的输出缓冲区
与其他写方法类的方法不同在于:
void newLine(); 写入一个行分隔符(自动配饰操作系统)

2 特殊流

2.1 “标准”输入输出流System.in/System.out

public static final InputStream in;
(System.in) “标准”输入流,常用于键盘输入.
public staic final PrintSteam out; (System.out) “标准”输出流,常用于显示器输出.
(标准是引号的原因未知,jdk API1.7:”standard”)

2.2 打印字节流PrintStream/打印字符流PrintWrite

重点区别之一,打印流可以在构造的时候指定开启自动刷新.
PrintStream: 包装器,为其他输出流添加功能,使其能方便的打印各种数据值表示形式
PrintWrite: 实现类似C语言中的printf()函数的输出控制效果

2.3 序列化流ObjectOutputStream/ObjectInputStream

序列化流,用于保存和读入类信息,static 和 transient 声明的变量不被保存

3 其他流

4 特别注释

文件类File

创建管理文件以及目录,包含4种构造方法和非常多个成员方法