java中的拷贝文件FileChannel

来源:互联网 发布:32寸网络电视价格表 编辑:程序博客网 时间:2024/05/17 00:51

以前用Java拷贝文件,只知道写byte数组循环拷贝,今天知道了可以用FileChannel进行拷贝,上代码:

下边是传统的byte数组拷贝方法

</pre><pre name="code" class="java">private void copyFilefromByte() throws IOException {long start = System.currentTimeMillis();MemorySee memorySee = new MemorySee();memorySee.begin();File name = new File("D:\\a\\hehe.zip");File n1 = new File("D:\\a\\a.zip");FileInputStream fileInputStream = new FileInputStream(name);n1.createNewFile();FileOutputStream fileOutputStream = new FileOutputStream(n1);byte[] bytes = new byte[1024000];int length = -1;while ((length = fileInputStream.read(bytes, 0, bytes.length)) != -1) {fileOutputStream.write(bytes, 0, length);}fileOutputStream.flush();fileOutputStream.close();fileInputStream.close();memorySee.end();memorySee.sayMemoryUse();long end = System.currentTimeMillis();System.out.println("run time:" + (end - start));}

下边是使用FileChannel拷贝文件的方法:

private void copyFileFromCannel() throws IOException {long start = System.currentTimeMillis();MemorySee memorySee = new MemorySee();memorySee.begin();File name = new File("D:\\a\\hehe.zip");File n1 = new File("D:\\a\\b.zip");FileInputStream fileInputStream = new FileInputStream(name);FileChannel fileChannel = fileInputStream.getChannel();n1.createNewFile();FileOutputStream fileOutputStream = new FileOutputStream(n1);FileChannel fileChannel2 = fileOutputStream.getChannel();int position = -1;long fileSize = name.length();int writeLength = 0;while (true) {writeLength += fileChannel2.transferFrom(fileChannel, writeLength,fileSize - writeLength);System.out.println("writeLength:"+writeLength);if (writeLength == fileSize) {break;}}fileChannel2.close();fileChannel.close();memorySee.end();memorySee.sayMemoryUse();long end = System.currentTimeMillis();System.out.println("run time:" + (end - start));}
还有一个辅助打印memory的类:

 class MemorySee{private long startM =0;private long endM =0;public void begin(){Runtime.getRuntime().gc();startM=Runtime.getRuntime().freeMemory();}public void end(){  endM=Runtime.getRuntime().freeMemory();}public void sayMemoryUse(){ System.out.println(startM-endM);}}


最后输出结果:

使用FileChannel拷贝的时间,要比byte节约大约1/2时间,或者更多,内存占用总比byte少,如果要提高byte的时间,那么就要提高byte的大小,这样就会消耗更多内存,总之,使用FileChannel既快速,又省内存。

0 0
原创粉丝点击