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

 

 

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

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();
 }