BufferedInputStream与BufferedOutputStream
我们有必要知道不带缓冲的操作,每读一个字节就要写入一个字节,由于涉及磁盘的IO操作相比内存的操作要慢很多,所以不带缓冲的流效率很低。带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高很多!
同时正因为它们实现了缓冲功能,所以要注意在使用
BufferedOutputStream
写完数据后,要调用flush()
方法或close()
方法,强行将缓冲区中的数据写出。否则可能无法写出数据。
//构造
BufferedInputStream(InputStream in) //使用默认buf大小、底层字节输入流构建bis
BufferedInputStream(InputStream in, int size) //使用指定buf大小、底层字节输入流构建bis
BufferedOutputStream(OutputStream out); //使用默认大小、底层字节输出流构造bos。默认缓冲大小是 8192 字节( 8KB )
BufferedOutputStream(OutputStream out, int size); //使用指定大小、底层字节输出流构造bos
package IO;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class BisBos {
public static void main(String[] args) throws IOException {
//简写异常抛出
BufferedInputStream bis=null;
BufferedOutputStream bos = null;
bis= new BufferedInputStream(new FileInputStream("D:\\tt.txt"));
bos = new BufferedOutputStream(new FileOutputStream("xx",true));
byte[] b=new byte[1024]; //代表一次最多读取1KB的内容
int length = 0 ; //代表实际读取的字节数
while( (length = bis.read( b ) )!= -1 ){
//length 代表实际读取的字节数
bos.write(b, 0, length );
}
//缓冲区的内容写入到文件
bos.flush();
bos.close();
bis.close();
}
}
关于流的关闭:先关闭外层流,再关闭内层流。一般情况下是:先打开的后关闭,后打开的先关闭;
另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b。
例如处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b。
还有支持mark操作,reset操作。