BufferedInputStream和BufferedOutputStream这两个类分别是FilterInputStream和FilterOutputStream的子类,作为装饰器子类,使用它们可以防止每次读取/发送数据时进行实际的写操作,代表着使用缓冲区.
不带缓冲的操作,每读一个字节就要写入一个字节,由于涉及磁盘的IO操作相比内存的操作要慢很多,所以不带缓冲的流效率很低。带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高.
BufferedOutputStream要调用flush()方法或close()方法,强行将缓冲区中的数据写出。否则可能无法写出数据。之后的BufferedReader和BufferedWriter与此类似。
BufferedInputStream 是缓冲输入流。它继承于FilterInputStream
BufferedInputStream 的作用是为另一个输入流添加一些功能,例如,提供“缓冲功能”以及支持mark()标记和reset()重置方法
BufferedInputStream 本质上是通过一个内部缓冲区数组实现的
public class BufferedInputStreamJava {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
String strFile = "d:" + File.separator + "javatest" + File.separator + "IO_RandomAccessFileTest.txt";
File f = new File(strFile);
FileInputStream fis = new FileInputStream(f);
BufferedInputStream bis = new BufferedInputStream(fis);
byte[] b = new byte[1024];
//注意:这里定义了result,用于返回读取到的字节个数
//在使用读到的字节数组的时候,如果没有result组装成String类输出的时候会有乱码
//这个时候组装的是缓存的byte数组,而这个数组最后的时候往往没有读满
int result = 0;
while((result = bis.read(b)) != -1) {
System.out.println(new String(b, 0, result));
//new String(b) 这里会正确输出读到的数据,但是后面有大量乱码符号
}
bis.close();
fis.close();
}
}
public class BUfferedOutputStream {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
String strFile = "d:" + File.separator + "javatest" + File.separator + "IO_RandomAccessFileTest.txt";
File f = new File(strFile);
//true代表续写到文件尾
FileOutputStream fos = new FileOutputStream(f, true);
BufferedOutputStream bos = new BufferedOutputStream(fos);
// \r\n换行
byte[] StrB1 = "写入数据1...\r\n".getBytes();
bos.write(StrB1);
bos.flush();
byte[] StrB2 = "写入数据2...".getBytes();
bos.write(StrB2);
//bos.close()没有关闭或者flush()的话,数据只会到缓冲区,不会到文件中
bos.close();
fos.close();
}
}