A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

对于字节流的读写用缓冲流的方法是
int by = 0;
while((by = bufis.read())!=-1)
{
        bufos.write(by);
}
这样是一个一个读取字节,还要向int转型,效率不是更低了吗?
虽然它还有另一个带字节数组的方法,但这些不是和InputStream没什么区别吗?
对于字符流的缓冲流可以用到readLine方法,一次读一行确实是提高了效率,但是字节缓冲流的高效是怎么一回事呢

5 个回复

倒序浏览
BufferedInputStream好像不常用吧?常用的是BufferedReader和BufferedWriter。打一个比方解释缓冲区的效率:有一堆西瓜(比喻成字节数据)从A地运往B地,普通方法一个一个的运(比喻read方法一个一个的读)。缓冲区的方法是先在A地弄一辆车,一个一个的往车上搬西瓜(比喻一个一个的读取字节),装满一车再一起拉到 B地卸下来。怎样?感觉是不是省事了?我的理解是这样的,不知是否准确。
回复 使用道具 举报
楼上说的很不错
回复 使用道具 举报
依然超级赛亚人 发表于 2014-8-28 23:03
BufferedInputStream好像不常用吧?常用的是BufferedReader和BufferedWriter。打一个比方解释缓冲区的效率 ...

很形象,感觉很有帮助!谢谢
回复 使用道具 举报
BufferedInputStream是对缓冲区进行操作,缓冲去就是一个字节数组
他的机制是,通过底层流(如:FileInputStream)的read()方法,将数组读满
然后读取的是数组里面的,也就是内存
而FileInputStream是调用windows的资源对数据源直接进行读取,通俗的说是对硬盘操作
那么是对内存读快还是对硬盘读快点呢

下面是代码测试证明缓冲流不是直接读取源文件,用的是BufferedReader,我就懒得用BufferedInputStream了,你可以自己去试试!!!
  1. public class BufferedReaderDemo {
  2.        
  3.         public static void main(String[] args) throws IOException{
  4.                
  5.                 writer();
  6.                 reader(2);//结果1---3---2---4---6
  7.                 /*
  8.                  * 结果分析:这里缓存的大小设置为2个字符
  9.                  * 第一次是缓冲流read(),这里设置缓冲流的缓冲大小为2个字符
  10.                  * 所以相当于调用2次FileReader底层流的read()方法,就将1 2放到缓存中去了------s1
  11.                  *
  12.                  * 第一次调用FileReader底层流的read()方法的时候,前面调用了2次FileReader的read(),那么这次指向3------c1
  13.                  *
  14.                  * 第二次调用缓冲流read(),是从缓冲中取数据 也就是2了------s2
  15.                  *
  16.                  * 第三次调用缓冲流read(),前面调用了3次FileReader的read(),缓存中没有数据了,所以又调用2次FileReader底层流的read()方法
  17.                  * 所以将 4 5放到缓存中,此次指向4------s3
  18.                  *
  19.                  * 第二次调用FileReader底层流的read()方法的时候,前面调用了5次FileReader的read(),所以这次指向 6------c2
  20.                  */
  21.         }
  22.         //写入一个字符串到文件中
  23.         public static void writer() throws IOException{
  24.                 String msg="123456789";
  25.                 FileWriter fw=new FileWriter("Demo.txt");
  26.                 fw.write(msg);
  27.                 fw.close();
  28.         }
  29.         //分别用缓存流和他的底层流(就是他构造函数中的参数)对数据进行读取
  30.         public static void reader(int size) throws IOException{
  31.                
  32.                 FileReader in=new FileReader("Demo.txt");
  33.                 BufferedReader br=new BufferedReader(in,size);
  34.                 char s1=(char)br.read();
  35.                 char c1=(char)in.read();
  36.                 char s2=(char)br.read();
  37.                 char s3=(char)br.read();
  38.                 char c2=(char)in.read();
  39.                 System.out.println(s1+"---"+c1+"---"+s2+"---"+s3+"---"+c2);
  40.                 br.close();
  41.         }
  42. }
复制代码

回复 使用道具 举报
BufferedInputStream 缓冲输入流    BufferedOutputStream 缓冲输出流
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马