在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_tmp_file.exists()) {

return ;

}

RandomAccessFile source_file = new RandomAccessFile(source_tmp_file, "r");

FileChannel source_channel = source_file.getChannel();

File dest_tmp_file = new File(dest);

if (!dest_tmp_file.isFile()) {

if (!dest_tmp_file.createNewFile()) {

source_channel.close();

source_file.close();

return;

}

}

RandomAccessFile dest_file = new RandomAccessFile(dest_tmp_file, "rw");

FileChannel dest_channel = dest_file.getChannel();

long left_size = source_channel.size();

long position = 0;

while (left_size > 0) {

long write_size = source_channel.transferTo(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();

BigFileCopy.copyByChannelToChannel("source_file", "dest_file");

long end_time = System.currentTimeMillis();

System.out.println("copy time = " + (end_time - start_time));

} catch (IOException e) {

e.printStackTrace();

}

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2019-05-04

java 拷贝大文件_java高效实现大文件拷贝功能相关推荐

  1. java 传输 大文件_java高效实现大文件拷贝功能

    在java中,FileChannel类中有一些优化方法可以提高传输的效率,其中transferTo( )和 transferFrom( )方法允许将一个通道交叉连接到另一个通道,而不需要通过一个缓冲区 ...

  2. java并发读取相同的文件_高效读取大文件,再也不用担心 OOM 了!

    最近阿粉接到一个需求,需要从文件读取数据,然后经过业务处理之后存储到数据库中.这个需求,说实话不是很难,阿粉很快完成了第一个版本. 内存读取 第一个版本,阿粉采用内存读取的方式,所有的数据首先读读取到 ...

  3. java ftp 文件移动文件_java实现FTP远程文件移动(重命名、复制、拷贝)

    首先就标题说明一点,java使用org.apache.commons.net.ftp.ftpclient包来操作FTP是很爽滴,但对远程文件操作,好像没有实现 复制文件的方法.我用的是文件移动(mov ...

  4. java 字符流读取_Java 字符流读写文件

    据说,java读写文件要写很多,贼麻烦,不像c艹,几行代码就搞定.只能抄抄模板拿来用了. 输入输出流分字节流和字符流.先看看字符流的操作,字节转化为字符也可读写. 一.写入文件 1.FileWrite ...

  5. java fileupload 文件_java用Commons fileupload 文件的上传

    java用Commons fileupload 文件的上传 基于表单的文件上传 如果在表单中使用表单元素 />,浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可供用户填写本地文件的文 ...

  6. java上传加密_Java上传下载文件并实现加密解密

    使用 Jersey 服务器实现上传,使用 HTTP 请求实现下载 引入依赖 在 pom.xml 中添加 Jersey 相关依赖 com.sun.jersey jersey-client 1.18.1 ...

  7. java文件打包jar文件_Java打包成jar文件,以及将jar文件导出为exe文件方法汇总(图形说明)...

    方法一:用j2ewiz,使用方法如下: 操作步骤: 1.         双击j2ewiz.exe,出现软件注册窗口,点击下一步. 2.         选择待转换的Jar文件及最低Jvm版本.我选择 ...

  8. doc无法编译java文件_java编译成jar文件.doc

    java编译成jar文件 Java程序打包成jar包 (2012-06-08 10:28:23) 转载▼ 标签: 分类: 方法一:通过jar命令 jar命令的用法: 下面是jar命令的帮助说明: 用法 ...

  9. java代码实现解压文件_Java压缩/解压文件的实现代码

    用java压缩/解压文件: import java.io.*; import java.awt.*; import java.awt.event.*; import java.util.*; impo ...

最新文章

  1. linux工程师前景_小猿圈预测2019年Linux云计算发展前景
  2. SortedList 泛型类
  3. 人工智能不确定性推理,柯南看的懂么?
  4. 当文员学计算机二级,二本学生毕业后在干什么?多半做3种工作,过来人深有同感...
  5. 为什么阿里如此钟爱Flink?
  6. ECMAScript6入门教程(二)
  7. R语言与正态总体均值的区间估计
  8. 做旋转铁甲机器人_「铁甲评测」柳工CLG921E视频全面讲解
  9. android 实现 效果代码,Android实现雷达View效果的示例代码
  10. leetcode 61 Rotate List ----- java
  11. Ubuntu下Arm-Linux-GCC交叉编译环境的搭建
  12. python金融网课_Python金融数据分析
  13. 这7款文本编辑器,程序员都应该知道
  14. HTML5课题意义,毕业论文选题的意义万能套话
  15. 想提高跨境电商转化率?采用这几个技巧!
  16. uc/os--OSRdyTbl
  17. (轻便)调试JavaScript的旺旺插件(基于jzshmyt的javascript-logger)
  18. tensorflow实战:由ckpt转成pb步骤的总结
  19. TASSEL软件导入plink格式文件报错
  20. WIFI 断线原因总结

热门文章

  1. Python列表和字典的本质和区别
  2. [转]调整 VirtualBox 虚拟机的磁盘大小
  3. docfx组件介绍--MarkdownLite
  4. vim中字体和配色方案设置
  5. POJ 3101 Astronomy (角速度啊,高中物理啊。。。T_T)
  6. HDOJ1203 I NEED A OFFER!
  7. Delphi 与 DirectX 之 DelphiX(82): TDIB.DrawMandelbrot();
  8. ES6新特性_浏览器中使用ES6模块化的另一种方式--JavaScript_ECMAScript_ES6-ES11新特性工作笔记044
  9. ES6新特性_ES6语法糖_class静态成员---JavaScript_ECMAScript_ES6-ES11新特性工作笔记034
  10. Seata多微服务互相调用_全局分布式事物使用案例_Account-Module 账户微服务说明---微服务升级_SpringCloud Alibaba工作笔记0064