相信大家在电脑上面进行大型文件拷贝的时候,比如电脑的D盘的某个文件拷贝到你的U盘上的时候,一定会遇到一个问题, 没错,就是速度慢,如果遇到这个问题且想解决这个问题的小伙伴看到我这篇文章你算幸福了,嘿嘿,话不多说,上代码。
使用不同流进行文件拷贝
public class FileCopy { public static void main(String[] args) { long start = System.currentTimeMillis(); try { //源文件 File src = new File("D:\\复习\\java知识点.zip"); //目标文件 File desc = new File("D:\\music\\java知识点.zip"); FileInputStream fis = new FileInputStream(src); FileOutputStream fos =new FileOutputStream(desc); byte[] b = new byte[1024*1024]; int len = -1; while((len=fis.read(b))!=-1){ fos.write(b, 0, len); fos.flush(); } fos.close(); fis.close(); } catch (IOException e) { e.printStackTrace(); } long end = System.currentTimeMillis(); System.out.println("共用时:"+(end-start)+"秒"); } } |
大字下载输入是68M/s,
如果使用的是byte[] b = new byte[1024*100];
那么下载用时时91065毫秒,下载速度大概是23M/s
那么由此引申出一个问题?就是尽然下载输入可以这么快,那其它网站还要限制下载速度了,让你开通特权,速度就才变快?
解答:
网站租用的服务器提供的带宽是有限的,比如限制是1000M每秒,要是不限制下载速度,要是你的网速也是1000M每秒,那所有带宽都为你服务了,其他所有人要等你用完才有机会下载,对于其他下载的用户是不公平的。
当我把这个参数值设置的越大是不是就会越快下载完成了?答案是错误的?如下例子正好和上面对吧可以说明
使用高级流进行文件拷贝
public static void main(String[] args) { long start = System.currentTimeMillis(); try { //源文件 File src = new File("D:\\复习\\java知识点.zip"); //目标文件 File desc = new File("D:\\music\\java知识点.zip"); //高级输入流 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src)); //高级输出流 BufferedOutputStream bos= new BufferedOutputStream(new FileOutputStream(desc)); byte[] b = new byte[1024*1024]; int len = -1; while((len=bis.read(b))!=-1){ bos.write(b, 0, len); bos.flush(); } bos.close(); bis.close(); } catch (IOException e) { e.printStackTrace(); } long end = System.currentTimeMillis(); System.out.println("共用时:"+(end-start)+"毫秒"); } |
使用字符流读取文件,然后通过打印流PrintWriter传输
public static void main(String[] args) { long start = System.currentTimeMillis(); try { //源文件 File src = new File("D:\\复习\\java知识点.zip"); //目标文件 File desc = new File("D:\\music\\java知识点.zip"); FileInputStream fis = new FileInputStream(src); //字符流读取文件 BufferedReader br =new BufferedReader(new InputStreamReader(fis)); //打印字符流 PrintWriter pw =new PrintWriter(new FileOutputStream(desc)); byte[] b = new byte[1024*1024]; String msg = null; while((msg=br.readLine())!=null){ pw.write(msg); pw.flush(); } pw.close(); br.close(); } catch (IOException e) { e.printStackTrace(); } long end = System.currentTimeMillis(); System.out.println("共用时:"+(end-start)+"毫秒"); } |
这里提示大家一点,我电脑还没有固态,因此,我想说的是我的这个拷贝速度可能还不是最高的,还有一点需要告诉大家,那个传输的字节并不是越大越好,相反过大还会物极必反,造成更加不好的效果。大家使用的时候也可以进行对比看下。毕竟我的电脑也只能是一个测试用例,并不能说明全部。
大家不懂的我们也可以一起讨论,以后我也经常会和大家分享一些我工作或者平时练习中遇到的一些问题和技术,虽然我在这个行业也还是算出入茅庐,但是每天的进步终将是一种成长,也是对自己在这个行业大量时间投入的最好的反馈。