• 使用带缓冲的字节流读写数据


    首先不使用带缓冲的字节流:

    package com.yunqing;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class bytelianxi {
        public static void main(String[] args) {
    
            try {
                //输入流"video.mp4":  相对路径:idea读取根目录下的video.mp4文件
                FileInputStream fis=new FileInputStream("video.mp4");
                //输出流,
                FileOutputStream fos=new FileOutputStream("newvideo.mp4");
    
                //声明一个byte字节数组吗,,每次读取100字节
                //这个字节可以根据读取文件的大小自行调整,假如读取一个100兆的视频,每次100字节效率会很慢
                //就可以多写一些,100000字节或者更多。******这个很影响效率的需要根据读取文件的大小自行调整。
                byte bt[]=new byte[100];
                int count=0;
                //距离1970年1月1号0点的毫秒数
                long curr=System.currentTimeMillis();
                //循环读取并写入文件,假如100兆的文件,每次读写100字节,那要循环很多很多次,这就影响效率
                while (fis.read(bt)!=-1){
                    fos.write(bt);
                    count++;
                }
                //关闭输入输出流
                fos.close();
                fis.close();
    
                System.out.println("循环次数"+count);
                //看读取这个文件的时间,毫秒。也就是效率
                System.out.println(System.currentTimeMillis()-curr+"毫秒");
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }

    结果:2秒多效率很低

    com.yunqing.bytelianxi
    循环次数387974
    2475毫秒
    
    Process finished with exit code 0

    然后进行优化,使用带缓冲的字节流读取数据

    BufferedInputStream是带缓冲区的输入流,默认缓冲区大小是8M,能够减少访问磁盘的次数,提高文件读取性能;BufferedOutputStream是带缓冲区的输出流,能够提高文件的写入效率。BufferedInputStream与BufferedOutputStream分别是FilterInputStream类和FilterOutputStream类的子类,实现了装饰设计模式。

    package com.yunqing;
    
    import java.io.*;
    
    public class youhua {
        public static void main(String[] args) {
    
            try {
                //输入流
                FileInputStream fis=new FileInputStream("video.mp4");
                //带缓冲的输入流
                //size:100000*****注意:idea的写法。缓冲区的大小,缓冲区的大小也影响读写效率,
                //如果读写的文件太大,也要适当的增加缓冲区的大小。
                BufferedInputStream bis=new BufferedInputStream(fis,100000);
                //输出流
                FileOutputStream fos=new FileOutputStream("new_video.mp4");
                //带缓冲的输出流
                BufferedOutputStream bos=new BufferedOutputStream(fos,100000);
                //这里我读取的是一个40兆左右的视频文件,设定一次读写100000字节,减少循环次数
                byte bt[]=new byte[100000];
                int count=0;
                long curr=System.currentTimeMillis();
                while (bis.read(bt)!=-1){
                    bos.write(bt);
                    count++;
                }
                //关闭字节流,后打开的先关闭
                bos.close();
                fos.close();
                bis.close();
                fis.close();
                System.out.println("循环次数"+count);
                System.out.println(System.currentTimeMillis()-curr+"毫秒");
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }

    结果:仅仅用了53毫秒

    com.yunqing.youhua
    循环次数388
    53毫秒
    
    Process finished with exit code 0
  • 相关阅读:
    Android之Parcel
    Android常用的IPC通信
    Android之Surface绘制原理
    Android之Surface
    Android之SurfaceFlinger服务
    Android Service(服务)
    Android Service进阶之路
    Android之UI线程启动
    Android之Activity显示原理
    python17-Django进阶
  • 原文地址:https://www.cnblogs.com/yunqing/p/7401161.html
Copyright © 2020-2023  润新知