zoukankan      html  css  js  c++  java
  • 使用带有缓冲的字节流读写数据

    -------------siwuxie095

       

       

       

       

       

       

    工程名:TestRWBufferedByteStream

    包名:com.siwuxie095.bufferedbytestream

    类名:ReadByBufferedByteStream.java

       

       

    打开资源管理器,在工程 TestRWBufferedByteStream 文件夹下,放入

    一部视频:movie.avi

     

       

    工程结构目录如下:

       

       

       

       

       

    代码:

       

    package com.siwuxie095.bufferedbytestream;

       

    import java.io.BufferedInputStream;

    import java.io.BufferedOutputStream;

    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.FileOutputStream;

    import java.io.IOException;

       

    public class ReadByBufferedByteStream {

     

    /**

    * 带有缓冲的字节流来读写数据,并实现文件的拷贝

    *

    * 缓冲区的大小和字节数组的大小的优化将决定最终的拷贝效率

    * 而缓冲区和字节数组的值根据文件的大小而变化,需要实际测试找到最优组合

    *

    * 注意:缓冲区的大小肯定是要大于字节数组的大小的,因为 字节数组是从缓冲区

    * 中读取的,将缓冲区读取完毕后,缓冲区才会从文件中读取

    * (此机制降低了磁盘读写次数,延长磁盘的使用寿命)

    *

    * @param args

    */

       

    public static void main(String[] args) {

     

    try {

     

    //创建一个 FileInputStream 来获取原始的字节输入流

    //传入一个Stringmovie.avi,这是一个视频文件,共 38 MB

    //文件比较大,因为这样才能凸显带有缓冲的字节流在读写效率上的高效

    //注意:有异常抛出,用 try catch 捕获即可

    FileInputStream fis=new FileInputStream("movie.avi");

     

     

    // FileInputStream 包装成一个带有缓冲的 BufferedInputStream

    //传入文件输入流 fis

    //还可以在指定文件输入流 fis 的同时指定缓冲区的大小(单位:字节)

    //缓冲区的大小也会影响当前流的操作的效率,这里可以设为 1000KB

    //BufferedInputStream bis=new BufferedInputStream(fis);

    BufferedInputStream bis=new BufferedInputStream(fis,1000000);

     

     

    //创建一个文件的输出流,使用相对路径

    FileOutputStream fos=new FileOutputStream("movie_new.avi");

    //再包装成一个带有缓冲的输出流,传入文件输出流 fos

    //设定缓冲区大小为 1000KB

    BufferedOutputStream bos=new BufferedOutputStream(fos,1000000);

     

     

     

     

    //使用 BufferedInputStream read()方法读取数据

    //并且是将数据读取到一个字节数组中,所以先创建一个字节型数组

    //将默认字节数组大小设置为100

    //数组大小这个参数有待优化,根据需要复制的文件的大小而定,

    //不一定越大越好,也不一定越小越好

    //原则:大型文件对应的数组大一些,小型文件对应的数组小一些

    byte input[]=new byte[100];

     

     

    //计数器

    int count=0;

    //System.currentTimeMillis() 返回从1970年到当前时间的毫秒数

    long before=System.currentTimeMillis();

     

     

    //由于每次读取的只是100字节,需要循环读取

    //这里 read()的返回值是整型,返回-1时读取完毕

    while (bis.read(input)!=-1) {

    //input数组写入到文件中

    bos.write(input);

    count++;//计算读取次数

    }

     

     

    //关闭流 先打开的后关闭 后打开的先关闭

    bis.close();

    fis.close();

    bos.close();

    fos.close();

     

    long after=System.currentTimeMillis();

    int time=(int) (after-before);

    System.out.println("耗时 "+time+" 毫秒");

    //读写次数过高相当于 访问了磁盘同样的次数,对磁盘开销相当大

    //如果把字节数组变大(在100的基础上变大,但不能过大),读写次数就会变少,

    //读写的速度也会相对增加

    System.out.println("读写了: "+count+" ");

     

     

    } catch (FileNotFoundException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

       

    }

       

       

    运行一览:

       

    1)不指定缓冲区大小,字节数组大小为 100 字节

       

    BufferedInputStream bis=new BufferedInputStream(fis);

    BufferedOutputStream bos=new BufferedOutputStream(fos);

    byte input[]=new byte[100];

       

       

       

       

    2)指定缓冲区大小为 1000 KB,字节数组大小为 100 KB

       

    BufferedInputStream bis=new BufferedInputStream(fis,1000000);

    BufferedOutputStream bos=new BufferedOutputStream(fos,1000000);

    byte input[]=new byte[100000];

       

       

       

       

    运行后,工程结构目录一览:

       

       

       

       

       

       

       

    【made by siwuxie095】

  • 相关阅读:
    随意给一组数,找出满足一下条件的a[i],a[i]左边的数小于等于a[i],a[i]右边的数大于等于a[i]
    SVN
    四种进程或线程同步互斥的控制方法
    二叉树转双向链表
    最大连续子序列和
    找出一个字符串中第一个只出现一次的字符
    清除浮动的那些事
    jQuery中ready与load事件的区别
    css 经典布局之圣杯布局(左右固定,中间自适应)
    window.name + iframe跨域实例
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6623514.html
Copyright © 2011-2022 走看看