IO---缓冲流
缓冲流
BufferedOutputStream
BufferedOutputStream 是缓冲输出流。它继承于FilterOutputStream。
应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
- 属性
protected byte buf[]; //内置缓存字节数组、用于存放程序要写入out的字节
protected int count; //内置缓存字节数组中现有字节总数
- 构造方法
public BufferedOutputStream(OutputStream out) {
this(out, 8192); //默认缓冲大小是 8192 字节( 8KB )
}
public BufferedOutputStream(OutputStream out, int size) { //使用指定大小、底层字节输出流构造bos
super(out);
if (size <= 0) {
throw new IllegalArgumentException("Buffer size <= 0");
}
buf = new byte[size];
}
- 方法
void flush() //刷新此缓冲的输出流。
void write(byte[] b, int off, int len) //将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。
void write(int b) //将指定的字节写入此缓冲的输出流。
//没有自己的`close`方法,当他调用父类`FilterOutputStrem`的方法关闭时,
//会间接调用自己实现的`flush`方法将buf中残存的字节flush到out中,再`out.flush()`到目的地中
eg
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("d:/blog/test.txt"));
bos.write("哈哈哈哈哈".getBytes());
bos.close();
BufferedInputStream
BufferedInputStream 是缓冲输入流。它继承于FilterInputStream。本质上是通过一个内部缓冲区数组实现的。
默认缓冲区大小是8k,通过read()读取输入流的数据时,会将该输入流的数据分批的填入到缓冲区中。
每当缓冲区中的数据被读完之后,输入流会再次填充数据缓冲区;如此反复,直到我们读完输入流数据位置。
- 属性
private static int defaultBufferSize = 8192; //内置缓存字节数组的大小 8KB
protected volatile byte buf[]; //内置缓存字节数组
protected int count; //当前buf中的字节总数
protected int pos; //当前buf中下一个被读取的字节下标
protected int markpos = -1; //最后一次调用mark(int readLimit)方法记录的buf中下一个被读取的字节的位置
protected int marklimit; //调用mark后、在后续调用reset()方法失败之前云寻的从in中读取的最大数据量、用于限制被标记后buffer的最大值
- 构造方法
public BufferedInputStream(InputStream in) { //使用默认buf大小、底层字节输入流构建bis
this(in, defaultBufferSize);
}
public BufferedInputStream(InputStream in, int size) { //使用指定buf大小、底层字节输入流构建bis
super(in);
if (size <= 0) {
throw new IllegalArgumentException("Buffer size <= 0");
}
buf = new byte[size];
}
- 方法
int available() //返回可以从此输入流读取(或跳过)、且不受此输入流接下来的方法调用阻塞的估计字节数。
void close() //关闭此输入流并释放与该流关联的所有系统资源。
void mark(int readlimit) //标记当前buf中读取下一个字节的下标
boolean markSupported() //测试此输入流是否支持 mark 和 reset 方法。
int read() //读取buf中下一个字节
int read(byte[] b, int off, int len) //从此字节输入流中给定偏移量处开始将各字节读取到指定的 byte 数组中。
void reset() //重置最后一次调用mark标记的buf中的位子
long skip(long n) //跳过n个字节、 不仅仅是buf中的有效字节、也包括in的源中的字节
eg
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:/blog/test.txt"));
byte[] buffer=new byte[1024];
int len=-1;
while((len=bis.read(buffer))!=-1){
System.out.print(new String(buffer, 0, len));
}
bis.close();
BufferedWriter
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
- 构造方法
BufferedWriter(Writer out) //创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz) //创建一个使用给定大小输出缓冲区的新缓冲字符输出流。
- 方法
void close() //关闭此流,但要先刷新它。
void flush() //刷新该流的缓冲。
void newLine() //写入一个行分隔符。
void write(char[] cbuf, int off, int len) //写入字符数组的某一部分。
void write(int c) //写入单个字符。
void write(String s, int off, int len) //写入字符串的某一部分。
eg
FileWriter fw = new FileWriter(new File("d:/blog/test.txt"));
BufferedWriter bw = new BufferedWriter(fw);
bw.write("11111111111");
bw.close();
fw.close();
BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
- 构造方法
BufferedReader(Reader in, int sz) //创建一个使用指定大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in) //创建一个使用默认大小输入缓冲区的缓冲字符输入流。
- 方法
void close() //关闭该流并释放与之关联的所有资源。
void mark(int readAheadLimit) //标记流中的当前位置。
boolean markSupported() //判断此流是否支持 mark() 操作(它一定支持)。
int read() //读取单个字符。
int read(char[] cbuf, int off, int len) //将字符读入数组的某一部分。
String readLine() //读取一个文本行。
boolean ready() //判断此流是否已准备好被读取。
void reset() //将流重置到最新的标记。
long skip(long n) //跳过字符。
eg
FileReader fr = new FileReader(new File("d:/blog/test.txt"));
BufferedReader br = new BufferedReader(fr);
String str = null;
while((str = br.readLine())!=null){
System.out.println(str);
}
br.close();
fr.close();