java学习笔记:IO流之字节缓冲流BufferedInputStream, BufferedOutputStream

java学习笔记:IO流之字节缓冲流BufferedInputStream, BufferedOutputStream

 

 

四、字节缓冲流
字节流一次读写一个数组的速度比一次读写一个字节的速度快很多,这是加了数组这样的缓冲区效果。所以java提供了字节缓冲区流。
1.
BufferedOutputStream: 字节缓冲输出流
BufferedInputStream: 字节缓冲输入流

2.构造方法
BufferedOutputStream(OutputStream out);
使用这种构造方法,它提供了一个默认的缓冲区大小,所以一般我们使用默认的缓冲区就可以了。
为什么构造方法传递的是一个OutputStream,而不是具体的文件或路径呢?因为字节缓冲区流仅仅提供缓冲区,而真正的底层的读写数据还得需要基本的流对象进行操作。
代码示例:
FileOutputStream fos = new FileOutputStream("a.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
上述两行代码等价于:BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt"));
bos.close();//释放资源

3.写数据
bos.write(65);//写一个字节
bos.write("abcdefg".getBytes());//写一个字节数组
bos.write("abcdefg".getBytes(), 0, 4);//写一个字节数组的一部分

4.构造方法
BufferedInputStream(InputStream in);
代码示例:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
读取方式1:一次读取一个字节
int by;
while((by = bis.read()) != -1){
  System.out.print((char)by);
}
读取方式2:一次读取一个字节数组
int len;
byte[] bys = new byte[1024];
while((len = bis.read(bys)) != -1){
  System.out.print(new String(bys, 0, len));
}
//释放资源
bis.close();

5.字节流复制文件的效率
System类的public static long currentTimeMillis();//返回以毫秒为单位的当前时间
long start = System.currentTimeMillis();//记录开始时间
...//待测试效率的代码,如:methodA()
long end = System.currentTimeMillis();//记录结束时间
共耗时 = end - start;//毫秒
设计四个方案:
  方案A:基本字节流,一次读写一个字节
  方案B:基本字节流,一次读写一个字节数组
  方案C:缓冲字节流,一次读写一个字节(要求记住)
  方案D:缓冲字节流,一次读写一个字节数组(要求记住)
代码:
//方案A:基本字节流,一次读写一个字节
private static void methodA() throws IOException{
  //封装数据源
  FileInputStream fis = new FileInputStream("d:\\复制图片.avi");
  //封装目的地
  FileOutputStream fos = new FileOutputStream("copy.avi");
  int by;
  while((by = fis.read()) != -1){
    fos.write((char)by);
  }
  fos.close();
  fis.close();
}

//方案B:基本字节流,一次读写一个字节数组
private static void methodB() throws IOException{
  //封装数据源
  FileInputStream fis = new FileInputStream("d:\\复制图片.avi");
  //封装目的地
  FileOutputStream fos = new FileOutputStream("copy.avi");
  byte[] bys = new byte[1024];
  int len;
  while((len = fis.read(bys)) != -1){
    fos.write(bys, 0, len);
  }
  fos.close();
  fis.close();
}

//方案C:缓冲字节流,一次读写一个字节(要求记住)
private static void methodC() throws IOException{
  //封装数据源
  BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:\\复制图片.avi"));
  //封装目的地
  BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.avi"));
  int by;
  while((by = bis.read()) != -1){
    bos.write((char)by);
  }
  bos.close();
  bis.close();
}

//方案D:缓冲字节流,一次读写一个字节数组(要求记住)
private static void methodD() throws IOException{
  //封装数据源
  BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d:\\复制图片.avi"));
  //封装目的地
  BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.avi"));
  byte[] bys = new byte[1024];
  int len;
  while((len = bis.read(bys)) != -1){
    bos.write(bys, 0, len);
  }
  bos.close();
  bis.close();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值