java传输⼤⽂件_java⾼效实现⼤⽂件拷贝功能
在java中,FileChannel类中有⼀些优化⽅法可以提⾼传输的效率,其中transferTo( )和 transferFrom( )⽅法允许将⼀个通道交叉连接到另⼀个通道,⽽不需要通过⼀个缓冲区来传递数据。只有FileChannel类有这两个⽅法,因此 channel-to-channel 传输中通道之⼀必须是FileChannel。不能在sock通道之间传输数据,不过socket 通道实现WritableByteChannel 和 ReadableByteChannel 接⼝,因此⽂件的内容可以⽤ transferTo( )⽅法传输给⼀个 socket 通道,或者也可以⽤ transferFrom( )⽅法将数据从⼀个 socket 通道直接读取到⼀个⽂件中。
Channel-to-channel 传输是可以极其快速的,特别是在底层操作系统提供本地⽀持的时候。某些操作系统可以不必通过⽤户空间传递数据⽽进⾏直接的数据传输。对于⼤量的数据传输,这会是⼀个巨⼤的帮助。
注意:如果要拷贝的⽂件⼤于4G,则不能直接⽤Channel-to-channel 的⽅法,替代的⽅法是使⽤ByteBuffer,先从原⽂件通道读取到ByteBuffer,再将ByteBuffer写到⽬标⽂件通道中。
下⾯为实现⼤⽂件快速拷贝的代码:
import java.io.File;
大文件发送import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class BigFileCopy {
/**
* 通过channel到channel直接传输
* @param source
* @param dest
* @throws IOException
*/
public static void copyByChannelToChannel(String source, String dest) throws IOException {
File source_tmp_file = new File(source);
if (!source_ists()) {
return ;
}
RandomAccessFile source_file = new RandomAccessFile(source_tmp_file, "r");
FileChannel source_channel = Channel();
File dest_tmp_file = new File(dest);
if (!dest_tmp_file.isFile()) {
if (!dest_ateNewFile()) {
source_channel.close();
source_file.close();
return;
}
}
RandomAccessFile dest_file = new RandomAccessFile(dest_tmp_file, "rw"); FileChannel dest_channel = Channel();
long left_size = source_channel.size();
long position = 0;
while (left_size > 0) {
long write_size = ansferTo(position, left_size, dest_channel); position += write_size;
left_size -= write_size;
}
source_channel.close();
source_file.close();
dest_channel.close();
dest_file.close();
}
public static void main(String[] args) {
try {
long start_time = System.currentTimeMillis();
long end_time = System.currentTimeMillis();
System.out.println("copy time = " + (end_time - start_time));
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持脚本之家。
发布评论