使用带有缓冲的字节流读写数据
-------------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 来获取原始的字节输入流 //传入一个String:movie.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】
posted on 2017-03-26 18:08 siwuxie095 阅读(2482) 评论(0) 编辑 收藏 举报