所有示例代码见github https://github.com/whbing/proTest/tree/master/pro-1/src/main/java/io
1. 4个基类
所有输出输入流全部继承以下4个积基类:
- InputStream
- Reader
- OutputStream
- Writer
字符和字节几乎完全一样。
- 字节就是1byte,即8bit
- 字符是2字节,16bit
以下全以字节流InputStream
、OutputStream
说明。
2. 比喻
----------------
①①①①①①①①①①
----------------
| 每个水滴就是一个字节或字符
\|/
指针记录
指针、缓冲 的加入使得允许高效处理输入输出、批量处理
。
3. InputStream 和 Reader
三个方法:
-
public abstract int read()
:从输入流中读单个字节。读取一个水滴。这是个抽象方法,没有实现。
-
public int read(byte/char b[])
:最多读取
b.length
个字节的数据,并存储在字节字节数组b中,返回实际读取的字节数。 -
public int read(byte/char b[], int off, int len)
:该方法见源码。从输入中最多读取
len
个字节,并将其存入字节数组b中,
放入数组时,并不是数组起点,而是从off位置开始,返回实际读取的字节数。
说明:使用带参数的read()时,read(byte[] b)
来读取多个水滴。这个数组byte[]
可以看成一个竹筒。每次取出一桶水滴。
程序多次重复取水,直到最后。直到read(byte[] b)
返回-1
,表示取水完毕。
–
FileInputStream 与 FileReader
上边的4个基类都不能创建实例。可以用子类。
如:
- 读取文件的输入流:
FileInputStream
和FileReader
。
示例: FileImputStream.java
自动关闭
打开的资源不属于内存资源,GC无法回收,需要close。Java7实现了所有IO资源类,都实现了AutoCloseable接口,都可以通过try-catch自动关闭。
以下用FileReader
来示例。(不会出现乱码)
说明:
try-resource-catch
其中try的()中只能放实现了Closeable的变量。
其他功能
- void mark(int readAheadLimit)
- boolean markSupported()
- void reset()
- long skip(ling n)
4. OutputStream 和 Writer
三个写的方法:
- void write(int c)
- void write(byte[]/char[] buf)
- void write(byte[]/char[] buf)
Writer以字符为操作单位,还支持以字符串代替字符数组。两个方法:
- void write(String str)
- void write(String str, int off, int len)
以下示例使用 FileInputStream 输入,并使用 FileOutputStream 输出,实现复制文件的功能。
FileOutputStream