Java——io流
InputStream 中的三个基本的读方法
- abstract int read() :读取一个字节数据,并返回读到的数据,如果返回 -1,表示读到了输入流的末尾。
- int read(byte[] b) :将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。
- int read(byte[] b, int off, int len) :将数据读入一个字节数组,同时返回实际读取的字节数。如果返回 -1,表示读到了输入流的末尾。off 指定在数组 b 中存放数据的起始偏移位置;len 指定读取的最大字节数。
字节输出流
下面是 IO 中输出字节流的继承关系。
OutputStream
- ByteArrayOutputStream
- FileOutputStream
- FilterOutputStream
- BufferedOutputStream
- DataOutputStream
- PrintStream
- ObjectOutputStream
- PipedOutputStream
总结:
- OutputStream 是所有的输出字节流的父类,它是一个抽象类。
- ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向 Byte 数组、和本地文件中写入数据。
- PipedOutputStream 是向与其它线程共用的管道中写入数据。
- BufferedOutputStream、DataOutputStream 和 PrintStream 都是处理流,他们的的父类是 FilterOutputStream。
outputStream中的三个基本的写方法
- abstract void write(int b):往输出流中写入一个字节。
- void write(byte[] b) :往输出流中写入数组b中的所有字节。
- void write(byte[] b, int?off, int?len) :往输出流中写入数组 b 中从偏移量 off 开始的 len 个字节的数据。
其它重要方法:
- void flush() :刷新输出流,强制缓冲区中的输出字节被写出。
- void close() :关闭输出流,释放和这个流相关的系统资源。
字节流的输入与输出的对应
java io 的输入和输出是高度对应的,下图表示字节流的输入与输出的对应关系。
上图中蓝色的为主要的对应部分,红色的部分是不对应部分。紫色的虚线部分代表这些流一般要搭配使用。
我们主要看看这些字节流中不对称的几个类:
- PushbackInputStream 为另一个输入流添加性能,即 “ 推回(push back)” 或 “ 取消读取(unread)” 一个字节的能力。
- SequenceInputStream 可以认为是一个工具类,将两个或者多个输入流当成一个输入流依次读取。完全可以从 IO 包中去除,还完全不影响 IO 包的结构。
- PrintStream 也可以认为是一个辅助工具。主要可以向其他输出流,或者 FileInputStream 写入数据,本身内部实现还是带缓冲的。本质上是对其它流的综合运用的一个工具而已。一样可以从 IO 包中去除!http://System.io 和 System.out 就是 PrintStream 的实例!
- StringBufferInputStream 和 StringBufferInputStream 已经过时,还允许它存在只是为了保持版本的向下兼容而已。
搭配使用的三对类: ObjectInputStream / ObjectOutputStream 和 DataInputStream / DataOutputStream 主要是要求写对象/数据和读对象 / 数据的次序要保持一致,否则可能不能得到正确的数据,甚至抛出异常(一般会如此);PipedInputStream / PipedOutputStream 在创建时一般就一起创建,调用它们的读写方法时会检查对方是否存在,或者关闭!
字符流
字符输入流 Reader
下面是 IO 中输入字符流的继承关系。
Reader
- BufferedReader
- LineNumberReader
- CharArrayReader
- FilterReader
- PushbackReader
- InputStreamReader
- FileReader
- PipedReader
- StringReader
总结:
- Reader 是所有的输入字符流的父类,它是一个抽象类。
- CharReader、StringReader 是两种基本的介质流,它们分别将 Char 数组、String 中读取数据。PipedReader 是从与其它线程共用的管道中读取数据。
- BufferedReader 很明显就是一个装饰器,它和其子类负责装饰其它 Reader 对象。
- FilterReader 是所有自定义具体装饰流的父类,其子类 PushbackReader 对 Reader 对象进行装饰,会增加一个行号。
- InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。
Reader 基本的三个读方法(和字节流对应):
(1) public int read() throws IOException; 读取一个字符,返回值为读取的字符。
(2) public int read(char cbuf[]) throws IOException; 读取一系列字符到数组 cbuf[]中,返回值为实际读取的字符的数量。
(3) public abstract int read(char cbuf[],int off,int len) throws IOException; 读取 len 个字符,从数组 cbuf[] 的下标 off 处开始存放,返回值为实际读取的字符数量,该方法必须由子类实现。
字符输出流 Writer
下面是 IO 中输出字符流的继承关系。
Writer
- BufferedWriter
- CharArrayWriter
- FilterWriter
- OutputStreamWriter
- FileWriter
- PipedWriter
- PrintWriter
- StringWriter
总结(和字节输出流对应):
- Writer 是所有的输出字符流的父类,它是一个抽象类。
- CharArrayWriter、StringWriter 是两种基本的介质流,它们分别向 Char 数组、String 中写入数据。PipedWriter 是向与其它线程共用的管道中写入数据。
- BufferedWriter 是一个装饰器为 Writer 提供缓冲功能。
- PrintWriter 和 PrintStream 极其类似,功能和使用也非常相似。
- OutputStreamWriter 是 OutputStream 到 Writer 转换的桥梁,它的子类 FileWriter 其实就是一个实现此功能的具体类。
writer 的主要写方法:
- public void write(int c) throws IOException; //写单个字符
- public void write(char cbuf[]) throws IOException; //将字符数组 cbuf[] 写到输出流 。
- public abstract void write(char cbuf[],int off,int len) throws IOException; //将字符数组cbuf[]中的从索引为off的位置处开始的len个字符写入输出流 。
- public void write(String str) throws IOException; //将字符串str中的字符写入输出流 。
- public void write(String str,int off,int len) throws IOException; //将字符串 str 中从索引 off 开始处的 len 个字符写入输出流 。
https://www.bilibili.com/video/BV1qL411u7eE?from=search&seid=4384031946893625881&spm_id_from=333.337.0.0