为什么要使用缓冲流?缓冲流对文件复制速度有什么影响?

通过不使用缓冲流代码与使用缓冲流代码来对比测试一波:

1package person.xsc.praticeIII; 2import java.io.BufferedInputStream; 3import java.io.BufferedOutputStream; 4import java.io.File; 5import java.io.FileInputStream; 6import java.io.FileNotFoundException; 7import java.io.FileOutputStream; 8import java.io.IOException; 9public class Copy3 { 10 public static void main(String[] args) throws FileNotFoundException{ 11 // TODO Auto-generated method stub 12 String srcPath="C:\\Users\\你是小朱老师呀\\Desktop\\JAVA编程.DOC"; 13 String destPath="C:\\Users\\你是小朱老师呀\\Desktop\\XSC\\test4.DOCX"; 14 //1.造源文件与目标文件 15 File srcFile = new File(srcPath); 16 File destFile = new File(destPath); 17 //2.造节点流 18 FileInputStream fis = new FileInputStream((srcFile)); 19 FileOutputStream fos = new FileOutputStream(destFile); 20 //文件大小 21 long dataSize=srcFile.length(); 22 System.out.println("文件大小:" + dataSize + " B"); 23 //不使用缓冲流去复制 24 long start0 = System.currentTimeMillis(); 25 byte[] byte0 = new byte[1024]; 26 int temp0 = 0 ; 27 try{ 28 while((temp0=fis.read(byte0))!=-1){ // 开始拷贝 29 fos.write(byte0,0,temp0) ; // 边读边写 30 } 31 System.out.println("不使用缓冲流拷贝完成!") ; 32 }catch(IOException e){ 33 e.printStackTrace() ; 34 System.out.println("不使用缓冲流拷贝失败!") ; 35 } 36 try{ 37 fis.close() ; // 关闭 38 fos.close() ; // 关闭 39 }catch(IOException e){ 40 e.printStackTrace() ; 41 } 42 long end0 = System.currentTimeMillis(); 43 //FileUtils.sizeOf(localFileCache) 44 System.out.println("不使用缓冲流复制需要 " + (end0-start0) + " ms"+"复制速度为:" + dataSize / (end0-start0) + " B/ms"); 45 //使用缓冲流去复制 46 BufferedInputStream bis = new BufferedInputStream(new FileInputStream((srcFile))); 47 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile)); 48 long start1 = System.currentTimeMillis(); 49 byte [] byte1 = new byte[1024]; 50 int temp1 = 0 ; 51 try{ 52 while((temp1=bis.read(byte1))!=-1){ 53 bos.write(byte1,0,temp1) ; 54 } 55 System.out.println("使用缓冲流拷贝完成!") ; 56 }catch(IOException e){ 57 e.printStackTrace() ; 58 System.out.println("使用缓冲流拷贝失败!") ; 59 } 60 try{ 61 fis.close() ; // 关闭 62 fos.close() ; // 关闭 63 }catch(IOException e){ 64 e.printStackTrace() ; 65 } 66 long end1 = System.currentTimeMillis(); 67 System.out.println("使用缓冲流复制需要 " + (end1-start1) + " ms"+"复制速度为:" + dataSize / (end1-start1) + " B/ms"); 68 } 69 70} 71输出: 72文件大小:405504 B 73不使用缓冲流拷贝完成! 74不使用缓冲流复制需要 8 ms复制速度为:50688 B/ms 75使用缓冲流拷贝完成! 76使用缓冲流复制需要 2 ms复制速度为:202752 B/ms

通过上面程序运行结果发现:加入缓冲处理流的复制速度将有明显的提升。至于为什么复制速度会提升,是因为不带缓冲的复制操作,每读一个字节就要写入一个字节,由于涉及磁盘的IO操作相比内存的操作要慢很多,所以不带缓冲的流效率很低。带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高很多!

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

tcp粘包与udp丢包的原因

tcp粘包与udp丢包的原因一,什么是tcp粘包与udp丢包TCP是面向流的, 流要说明就像河水一样, 只要有水, 就会一直流向低处, 不会间断. TCP为了提高传输效率, 发送数据的时候, 并不是直接发送数据到网路, 而是先暂存到系统缓冲, 超过时间或者缓冲满了, 才把缓冲区的内容发送

IO编程实例——使用缓冲流实现文件的拷贝

数据源:"C:\\Users\\你是小朱老师呀\\Desktop\\test.txt"数据的目的地:"C:\\Users\\你是小朱老师呀\\Desktop\\XSC\\test.txt"实现步骤:1.创建源文件与目标文件2.创建节点流3.创建缓冲流4.读取、写入5.释放packageperson.xsc.praticeIII;importjava.

Java IO输入输出

学前知道Java的IO使用“流”的概念来表示。IO流涉及到数据源和目的地。流,是从源“流向”目的的数据流。Java将各种数据源和目标之间数据的传输统一抽象为流,通过对流对象的操作来完成I/O功能。输入输出实际都是对内存而言的。数据源可以是键盘、文件、应用程序、鼠标、网络连接。

Java NIO和IO的区别

IO               NIO面向流           面向缓冲阻塞IO           非阻塞IO无               选择器面向流与面向缓冲JavaNIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。JavaIO面向流意味着每次从流中

udp之关于linux udp收发包缓冲区大小

1、修订单个socket的缓冲区大小:通过setsockopt使用SO\_RCVBUF来设置接收缓冲区,该参数在设置的时候不会与rmem\_max进行对比校验,但是如果设置的大小超过rmem\_max的话,则超过rmem\_max的部分不会生效;2、修订linux系统udp缓冲区大小:通过rmem\_max来设置系统中udp缓存的上限,该值可通过如下方