一.老祖宗:4个抽象类
抽象类 InputStream 和 OutputStream 构成输入/输出类的基础。读写操作基于一个字节序列。
抽象类 Reader 和 Writer 专门用于处理Unicode字符。读写操作基于两个字节的Unicode码元。
抽象类InputStream:属于java.io包;实现Closeable接口
常量:
int MAX_SKIP_BUFFER_SIZE = 2048; 能跳过的最大字节数量(skip()用)
抽象方法(子类必须实现)
abstract int read() 读入一个字节。具体的输入流类必须且只需覆盖这个方法以提供具体的输入功能。
非抽象方法
int read(byte b[]) read和write方法在执行时都将阻塞,即等待输入/输出。其他线程则有机会执行。
(阻塞意味着当前线程将失去它对资源的占用。)
int read(byte b[], int off, int len) 从输入流中读取字节,并将其存储在缓冲区数组 b 中。
返回读取的总字节数;如果达到流的末尾,返回 -1;如果len为0,不读取字节并 返回 0;
long skip(long n) 跳过n个字节。跳过的最大字节数为(MAX_SKIP_BUFFER_SIZE = 2048)
实际上临时创建了个byte数组,读入n个字节。
int available() 返回在不阻塞的情况下可获取的字节数。
int close() 释放。
void mark(int readlimit) 打标记。synchronized
void reset()
boolean markSupported() 是否支持打标记
抽象类OutputStream:属于java.io包;实现Closeable,Flushable接口
抽象方法(子类必须实现)
abstract void write(int b) 读入一个字节。具体的输入流类必须且只需覆盖这个方法。
非抽象方法
抽象类Reader:属于java.io包;实现Readable, Closeable接口
抽象方法(子类必须实现): read(char[], int, int) close()
skip()方法跳过的最大字节数8192
抽象类Writer:属于java.io包;实现Appendable, Closeable, Flushable接口
抽象方法(子类必须实现): write(char[], int, int)、flush() 和 close()
可以输出字符int,字符数组char[],和字符串String
Writer append(CharSequence csq)
Writer append(CharSequence csq, int start, int end)
Writer append(char c) 将指定字符序列添加到此 writer
//返回的是类本身,所以可以写成:
writer.append("........").append("........").append(....).append(......);
</pre><pre name="code" class="java">注意:
1.可以看到,InputStream 和 Reader 类中的read方法面对的<span style="font-family: Arial, Helvetica, sans-serif;">分别是字节和字符,</span><span style="font-family: Arial, Helvetica, sans-serif;">但是</span><span style="font-family: Arial, Helvetica, sans-serif;">返回类型都是int。</span>
<span style="white-space:pre"> read()方法内部将读取到的所有字节高位补0转为int返回, 这样做所有的数据都会是正数</span>。然后才可以用-1表示流的结尾。(不会与所读取的数据重复)
<span style="white-space:pre"> </span>然后将数据强转回(byte),就可以得到原始数据。
关于四个接口:Flushable, Closeable,Readable, Appendable 接口略。