功能逻辑:将一个视频文件通过缓冲字节输入流进行读取,然后再通过缓冲字节输出流将其重新拷贝输出。
public static void main(String[] args) {try {FileInputStream fis = new FileInputStream("Rick_and_Morty.mkv");//第二个参数指定了缓冲区的size,根据实际的执行时间可以优化这个数字。BufferedInputStream bis = new BufferedInputStream(fis,1000000);FileOutputStream fos = new FileOutputStream("Rck.mkv");BufferedOutputStream bos = new BufferedOutputStream(fos,1000000);//byte数组会先从缓冲区取得数据,大型文件对应的数据可以大一些,小文件对应的数组可以小一些。byte[] input = new byte[1000000];int count = 0;long before = System.currentTimeMillis();//while循环读取视频文件,-1代表已经将文件的字节流全部读取了,!=-1则文件继续读取while (bis.read(input) != -1) {bos.write(input);count++;}//输入流一组,输出流一组,先打开的流后关闭bis.close();fis.close();bos.close();fos.close();long after = System.currentTimeMillis();System.out.println("读取时间为:" + (after - before) + "ms");System.out.println("访问磁盘:" + count + "次");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
此例简单的实现了一个视频文件从输入到输出的过程,视频文件大小为301,199,257 bytes,执行结果如下:
读取时间为:450ms
访问磁盘:302次
这是通过多次改变字节数组的大小和缓冲区初始大小得出的较优结果,在实际应用中,可以多次进行尝试。
而且在实际应用中,带缓冲的字节输入输出流性能要优于不带缓冲区的字节输入输出流。