Welcome 微信登录

首页 / 软件开发 / JAVA / java文件操作及缓存机制依旧有瓶颈

java文件操作及缓存机制依旧有瓶颈2014-08-01 cq520 我们在使用windows系统时发现,复制一个文件的再粘贴的速度大体上是一致的,我们可以猜想这是微软内部的工作人员设计的一个算法,而这个操作所能实现的最大速度是由什么影响的呢??

那么我们可不可以自己设计一个方法来代替windows自带的复制粘贴方法来达到更快的传输速度呢??

下面的一段代码就以缓冲的形势来实现了文件的copy工作:

publicvoid copybyte(String srcFile,String destFile)throws IOException{//创建输入流InputStream ins=new FileInputStream(srcFile);//创建输出流OutputStream outs=new FileOutputStream(destFile);//创建缓冲区,一次读取16K的文件byte[] buf=newbyte[16384];int i=ins.read(buf);System.out.println("开始复制....");//获取当前时间System.out.println(System.currentTimeMillis());while(i!=-1){outs.write(buf);i=ins.read(buf);}System.out.println(System.currentTimeMillis());System.out.println("复制结束....");//关闭流ins.close();outs.close();}
首先,我使用了一个860多M的程序进行测试,发现在windows中复制粘贴的速度大体上是在40M每秒左右,复制一个这样的文件大约需要20多秒的时间,而使用上述方法进行复制的时候,经过反复的测试,发现时间基本上在23秒左右的样子,而且当数值超过16K之后,速度就不会再增大了,而调整为8K的时候,时间大概在29秒左右,其实这也就解释了一个现象,算法本身并不能超过电脑硬盘与CPU之间的交互速度,硬件依旧是瓶颈,但是我们能不能用一块外置的更快的硬盘来实现提升原本硬盘的速度呢??

此外,看过BufferredInputStream源码的都知道,里面有这样的一个属性:

privatestaticintdefaultBufferSize = 8192;

这就说明,缓冲输入流定义的缓冲数组的大小是8K,并没有达到计算机的极限速度,计算机还有更多的秘密等待着我们去发现呢