我们举两个例子:
BufferedInputStream和FileInputStream
当用FileInputStream时,read()是从底层读取一个字节,read(byte[],int off,int len)
则是一次性取len-off个字节,我们需要提供一个byte[]来存放。
而用BufferedInputStream的时候,其read()其实和read(byte[],int off,int len)一样
内部都是调运构造函数输入的的FIleInputStream的read(byte[] ,int off,int len)的方法,将底层数据读入byte[]中,而且byte[]不需要我们来提供,类本身定义了一个byte[] buf数组,来存放这些数据,所以,如果是使用BufferedInputStreamer
而程序要不需要对byte[]数组操作,直接这样写就可以:
FileInputStream fis=new FileInputStream("a.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
int data=0;
while((data=bis.read())!=-1){
.....
}
这样虽然也是一次次读一个字节,但是不是吗,每次都是从底层读取数据,而是一次从底层读取buf.length个字节到buf数组中,然后从buf中一次读取一个字节,减少频繁调用底层资源的开销。
这个等同于
FileInputStream fis=new FileInputStream("a.txt");
byte[] mybuff=new byte[1024];
int count=0;
while((count=fis.read(mybuff))!=-1)
{
...
}
如果是用BufferedInputStream的read(byte [],int off,int len),那缓冲则由传入的byte[]
来充当。
所恶这么多,那如果要缓冲用FileInputStream还是BufferedInputStream?
BufferedInputStream主要不是提供buf,而是封装了缓冲和标记、回读的功能
。如果既用不到标记和回读,又不需要操作中间的缓冲数组,那么显而易见直接用FielInputStream的read(byte [],int off,int len)效率最高。
最后说一下为什么,为什么用缓冲性能就更好,因为程序可以将多个字节写入底层输入流(native read(byte)),而不必针对每一个字节写入都调用底层输入流(native read(byte)),
|