Fork me on GitHub

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

-------------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】

posted on 2017-03-26 18:08  siwuxie095  阅读(2482)  评论(0编辑  收藏  举报

导航