2
public class BufferedReader
extends Reader
java.io.BufferedReader类继承自java.io.Reader类。
BufferedReader从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。可以指定缓冲区的大小,或者使用默认的大小,大多数情况下,默认值就足够大了。
通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read( ) 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。例如,BufferedReader in
= new BufferedReader(new FileReader("foo.in"));
BufferedReader in
= new BufferedReader(new InputStreamReader(System.in));
如果没有缓冲,则每次调用 read( ) 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。通过用合适的 BufferedReader 替代每个 DataInputStream,可以对将 DataInputStream 用于文字输入的程序进行本地化。
BufferedReader(Reader in) | 创建一个使用默认大小输入缓冲区的缓冲字符输入流。 |
BufferedReader(Reader in, int sz) | 创建一个使用指定大小输入缓冲区的缓冲字符输入流。 |
void close( ) | 关闭该流并释放与之关联的所有资源。 |
int read(char[ ] cbuf, int off, int len) | 将字符读入数组的某一部分。 它将通过重复地调用底层流的 read 方法,尝试读取尽可能多的字符。这种迭代的 read 会一直继续下去,直到满足以下条件之一: |
int read( ) | 读取单个字符。 |
String readLine( ) | 读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。 |
void mark(int readAheadLimit) | 标记流中的当前位置。 readAheadLimit - 在仍保留该标记的情况下,对可读取字符数量的限制。在读取达到或超过此限制的字符后,尝试重置流可能会失败。限制值大于输入缓冲区的大小将导致分配一个新缓冲区,其大小不小于该限制值。因此应该小心使用较大的值。 |
boolean markSupported( ) | 判断此流是否支持 mark() 操作(它一定支持)。 |
boolean ready( ) | 判断此流是否已准备好被读取。 |
void reset( ) | 将流重置到最新的标记。如果从未标记过该流,抛异常。 |
long skip(long n) | 跳过n个字符。 |
mark就像书签一样,在这个BufferedReader对应的buffer里作个标记,以后再调用reset时就可以再回到这个mark过的地方。mark方法有个参数,通过这个整型参数,你告诉系统,希望在读出这么多个字符之前,这个mark保持有效。读过这么多字符之后,系统可以使mark不再有效,而你不能觉得奇怪或怪罪它。这跟buffer有关,如果你需要很长的距离,那么系统就必须分配很大的buffer来保持你的mark。
调用mark(int readlimit)方法后读取多少字节标记才失效,是取readlimit和BufferedReader类的缓冲区大小两者中的最大值,而并非完全由readlimit确定。