一、流的基本概念
此处略......
二、字节输出流OutputStream【JDK1.0】
API中:
public abstract class OutputStream extends Object mplements Closeable, Flushable;
首先,我们可以发现实现了两个接口:Closeable,Flushable
Closeable【JDK1.5】简介:
只有一个方法Close();
父接口:AutoCloseable【JDK1.7】
Flushable【JDK1.5】简介:
只有一个方法Flush();
继承关系图:
OutputStream类定义的是一个公共的输出操作标准,而在这个操作标准里面一共定义了3个方法
No. | 方法名称 | 类型 | 作用 |
01 | public abstract void write(int b) throws IOException | 普通 | 输出单个字节数据 |
02 | public void write(byte[] b) throws IOException | 普通 | 输出一组字节数据 |
03 | public void write(byte[] b, int off, int len) throws IOException | 普通 | 输出部分字节数据 |
子类: FileOutputStream简介
构造方法:
- 【覆盖】构造方法:public FileOutputStream(File file) throws FileNotFoundException
- 【追加】构造方法:public FileOutputStream(File file, boolean append) throws FileNotFoundException
三、字节输入流InputStream【JDK1.0】
API中:
public abstract class InputStream extends Object implements Closeable;
InputStream类定义了如下核心方法
No. | 方法名称 | 类型 | 作用 |
01 | public abstract int read() throws IOException | 普通 | 读取单个字节数据,如果读取到底了,返回-1 |
02 | public int read(byte[] b)throws IOException | 普通 | 读取一组字节数据 |
03 | public int read(byte[] b,int off,int len)throws IOException | 普通 | 读取一组字节数据,但是只占数组的一部分 |
子类:public class FilterInputStream extends InputStream
在JDK1.9之后出现了一个新方法:public byte[] readAllBytes() throws IOException;但是这个方法并不好用,如果文件太大,则不适用。
四、字符输出流Writer【JDK1.1】
API中:
public abstract class Writer extends Object implements Appendable, Closeable, Flushable
结构图:
writer中提供了很多的方法,我们重点看下面两个:
- 输出字符数组:public void write(char[] cbuf) throws IOException
- 输出字符串:public void write(String str)throws IOException
五、字符输入流:Reader【JDK1.1】
API中:
public abstract class Reader extends Object implements Readable, Closeable
字符流读取的时候只能按照字符数组的形式来进行操作,没有字符串的整体输入。
六、字节流和字符流的区别
观察OutputStream与Writer的区别
都使用了Close()来进行关闭处理。如果OutputStream不使用Close()来关闭,发现依然输出正常,如果Writer没有使用CLose(),发现无法正常输出,原因是因为Writer用到了缓存。当使用了Close()的时候,实际上会出现强制刷新缓冲区的情况,如果没有关闭,那么无法进行输出操作。如果想要在不关闭的情况下正常输出,可以使用flush()强制刷新。
字节流不会用到缓冲区,字符流会用到。
七、转换流
指的是可以将字节流和字符流的功能相互装换。提供了两个类:OutputStreamWriter、InputStreamReader
所谓的转换流就是将收到的对象向上转型转换得到的。
Writer继承结构:
FileWriter继承结构:
FileReader继承结构:
八、实例:文件拷贝
方案一:使用InputStream将全部要拷贝的内容直接读取到程序里面,但是又一个致命的缺点就是:文件太大的话,程序基本上就死了。
方案二:采用部分拷贝,读取一部分输出一部分,如果采取这种方法,核心的操作方法:
InputStream: public int read(byte[] b) throws IOException;
OutputStream: public void write(byte[] b,int off,int len) throws IOException;
在JDK1.9版本后,出现了两个新方法:
InputStream: public long transferTo(OutputStream out)throws IOException;【JDK1.9】
Reader: public long transferTo(Writer out) throws IOException;【JDK1.10】
比传统方法效率更高。
注:初学者,写的不好请见谅,如有相关问题记得私信我