Java I/O
1.I/O体系
I/O设计出来是为了解决IO相关操作的。IO操作有网络IO和磁盘IO。网络相关的类都在java.net包下。Java I/O主要说明磁盘I/O。I/O类图如下:
从数据传输方式角度,可以将I/O类分为:
1、字节流
2、字符流
字节流是以一个字节单位来运输的,而字符流是以一个字符来传输的,按照不同的编码格式,一个字符对应多个字节。
2.I/O类和相关方法
IO 类虽然很多,但最基本的是 4 个抽象类:InputStream、OutputStream、Reader、Writer。最基本的方法也就是一个读 read() 方法、一个写 write() 方法。方法具体的实现还是要看继承这 4 个抽象类的子类,毕竟我们平时使用的也是子类对象。这些类中的一些方法都是(Native)本地方法、所以并没有 Java 源代码,按照上面这个思路看,先看子类基本方法,然后在看看子类中还新增了那些方法,相信你也可以看懂的,我这里就只对上后面说的常用的类进行总结。
InputStream 类
方法 | 方法介绍 |
---|---|
public abstract int read() | 读取数据 |
public int read(byte b[]) | 将读取到的数据放在 byte 数组中,该方法实际上是根据下面的方法实现的,off 为 0,len 为数组的长度 |
public int read(byte b[], int off, int len) | 从第 off 位置读取 len 长度字节的数据放到 byte 数组中,流是以 -1 来判断是否读取结束的(注意这里读取的虽然是一个字节,但是返回的却是 int 类型 4 个字节,这里当然是有原因,这里就不再细说了,推荐这篇文章,链接) |
public long skip(long n) | 跳过指定个数的字节不读取,想想看电影跳过片头片尾 |
public int available() | 返回可读的字节数量 |
public void close() | 读取完,关闭流,释放资源 |
public synchronized void mark(int readlimit) | 标记读取位置,下次还可以从这里开始读取,使用前要看当前流是否支持,可以使用 markSupport() 方法判断 |
public synchronized void reset() | 重置读取位置为上次 mark 标记的位置 |
public boolean markSupported() | 判断当前流是否支持标记流,和上面两个方法配套使用 |
OutputStream 类
方法 | 方法介绍 |
---|---|
public abstract void write(int b) | 写入一个字节,可以看到这里的参数是一个 int 类型,对应上面的读方法,int 类型的 32 位,只有低 8 位才写入,高 24 位将舍弃。 |
public void write(byte b[]) | 将数组中的所有字节写入,和上面对应的 read() 方法类似,实际调用的也是下面的方法。 |
public void write(byte b[], int off, int len) | 将 byte 数组从 off 位置开始,len 长度的字节写入 |
public void flush() | 强制刷新,将缓冲中的数据写入 |
public void close() | 关闭输出流,流被关闭后就不能再输出数据了 |
再来看 Reader 和 Writer 类中的方法,你会发现和上面两个抽象基类中的方法很像。
Reader 类
方法 | 方法介绍 |
---|---|
public int read(java.nio.CharBuffer target) | 读取字节到字符缓存中 |
public int read() | 读取单个字符 |
public int read(char cbuf[]) | 读取字符到指定的 char 数组中 |
abstract public int read(char cbuf[], int off, int len) | 从 off 位置读取 len 长度的字符到 char 数组中 |
public long skip(long n) | 跳过指定长度的字符数量 |
public boolean ready() | 和上面的 available() 方法类似 |
public boolean markSupported() | 判断当前流是否支持标记流 |
public void mark(int readAheadLimit) | 标记读取位置,下次还可以从这里开始读取,使用前要看当前流是否支持,可以使用 markSupport() 方法判断 |
public void reset() | 重置读取位置为上次 mark 标记的位置 |
abstract public void close() | 关闭流释放相关资源 |
Writer 类
方法 | 方法介绍 |
---|---|
public void write(int c) | 写入一个字符 |
public void write(char cbuf[]) | 写入一个字符数组 |
abstract public void write(char cbuf[], int off, int len) | 从字符数组的 off 位置写入 len 数量的字符 |
public void write(String str) | 写入一个字符串 |
public void write(String str, int off, int len) | 从字符串的 off 位置写入 len 数量的字符 |
public Writer append(CharSequence csq) | 追加吸入一个字符序列 |
public Writer append(CharSequence csq, int start, int end) | 追加写入一个字符序列的一部分,从 start 位置开始,end 位置结束 |
public Writer append(char c) | 追加写入一个 16 位的字符 |
abstract public void flush() | 强制刷新,将缓冲中的数据写入 |
abstract public void close() | 关闭输出流,流被关闭后就不能再输出数据了 |
| 关闭输出流,流被关闭后就不能再输出数据了 |