设为首页 加入收藏

TOP

Java实现文件拷贝(一)
2014-11-24 02:56:01 来源: 作者: 【 】 浏览:2
Tags:Java 实现 文件 拷贝

经过一组简单的测试发现JAVA NIO提供的文件内存映射方法实现文件拷贝速度最快,不管是大文件还是小文件,特别是大文件的拷贝速度比普通方法提高20倍,唯一有个前提就是内存需要足够大,否则文件映射肯定失败(当然可以通过分割文件,部分映射的方法避免,但就比较麻烦了);其次NIO提供的文件管道传输速度也比较好,如果没法做文件内存映射,推荐这种拷贝方法;另外,Buffer的大小,对于读写速度还是有影响的,基本就是Buffer越大读写越快(有个疑问就是Buffer.allocateDirec()效率提高不明显);最后,总体看来NIO的效率比老IO高,不管使用哪种方式,老IO使用流读写只能一个字节一个字节的抠,NIO使用块的方式读写还是相对比较快,所以没有特别需求的情况下,推荐使用NIO,目前NIO基本能覆盖老IO的所有功能(当然NIO还提供N多新功能)。


测试环境


123456789 Eclipse(Juno) JVM(Sun JDK1.7) 参数:
-Xms1536m
-Xmx1536m
-Xverify:none -XX:+UseParallelGC
-XX:PermSize=128M
-XX:MaxPermSize=128M
OS参数:
Win7 64Bit + 4GB
物理磁盘空间充足


测试代码


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class FileCopy {
private static final int BUFFER_SIZE_1024 = 1024;
private static final int BUFFER_SIZE_4096 = 4096;
private static final int BUFFER_SIZE_10240 = 10240;

private static final String FROM_FILE_42MB = "G:/from_42MB.rar";
private static final String FROM_FILE_1GB = "G:/from_350MB.rar";

private static int BUFFER_SIZE = BUFFER_SIZE_1024;
private static String FROM_FILE = FROM_FILE_42MB;
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
System.out.println("File :" + FROM_FILE + " ---- Buffer Size : " + BUFFER_SIZE + "--------------");
testFileCopy();

BUFFER_SIZE = BUFFER_SIZE_4096;
System.out.println("File :" + FROM_FILE + " ---- Buffer Size : " + BUFFER_SIZE + "--------------");
testFileCopy();

BUFFER_SIZE = BUFFER_SIZE_10240;
System.out.println("File :" + FROM_FILE + " ---- Buffer Size : " + BUFFER_SIZE + "--------------");
testFileCopy();

BUFFER_SIZE = BUFFER_SIZE_1024;
FROM_FILE = FROM_FILE_1GB;
System.out.println("File :" + FROM_FILE + " ---- Buffer Size : " + BUFFER_SIZE + "--------------");
testFileCopy();

BUFFER_SIZE = BUFFER_SIZE_4096;
FROM_FILE = FROM_FILE_1GB;
System.out.println("File :" + FROM_FILE + " ---- Buffer Size : " + BUFFER_SIZE + "--------------");
testFileCopy();

BUFFER_SIZE = BUFFER_SIZE_10240;
FROM_FILE = FROM_FILE_1GB;
System.out.println("File :" + FROM_FILE + " ---- Buffer Size : " + BUFFER_SIZE + "--------------");
testFileCopy();

}
private static void testFileCopy() throws FileNotFoundException,
IOException {
coypByMbb();
copyByNioTransferFrom();
copyByNioTransferTo();
coypByBufferRead();
coypByFastBufferRead();
coypByStream();//Old IO style
}
/**
* 使用FileChannel.transferFrom()实现
* @throws FileNotFoundException
* @throws IOException
*/
private static void copyByNioTransferFrom() throws FileNotFoundException,
IOException {
long startTime = System.currentTimeMillis();
RandomAccessFile fromFile = new RandomAccessFile(FROM_FILE, "rw");
FileChannel fromChannel = fromFile.getChannel();
RandomAccessFile toFile = new RandomAccessFile("G:/to1.rar", "rw");
FileChannel toChannel = toFile.getChannel();
long position = 0;
long count = fromChannel.size();
toChannel.transferFrom(fromChannel, position, count);
long en

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java多线程模式 下一篇Android_ListView用法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: