两种文件通道复制文件方式的性能比较

import java.io.FileInputStream;
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;
import java.nio.channels.FileChannel.MapMode; import org.junit.Test; /**
* 比较IO操作的性能比较
* 1.内存映射最快
* 2.NIO读写文件
* 3.加了缓存流的IO
* 4.普通IO
* 使用文件通道的方式复制文件
*/
public class ChannelDemo { public static void main(String[] args) throws Exception {
String src = "F:/022_37分钟零基础开发桌球小游戏项目~1.mp4";// 文件源路径,测试文件大小为145828字节
String dest = "F:/022_37分钟零基础开发桌球小游戏项目~1bak.mp4";// 文件目的地路径 copyFile(src, dest);// 总耗时:5457ms
randomAccessFileCopy(src, dest);// 总耗时:1135ms
} @Test
private static void randomAccessFileCopy(String src, String dest) throws IOException {
long start = System.currentTimeMillis(); // 获得输入输出流的文件通道
FileChannel fcIn = new RandomAccessFile(src, "r").getChannel();
FileChannel fcOut = new RandomAccessFile(dest, "rw").getChannel(); // 输入流的字节大小
long size = fcIn.size(); // 输入输出流映射到缓冲区
MappedByteBuffer inBuf = fcIn.map(MapMode.READ_ONLY, 0, size);
MappedByteBuffer outBuf = fcOut.map(MapMode.READ_WRITE, 0, size); // 目的:将输入流缓冲区的内容写到输出流缓冲区就完成了文件的复制
// 操作的是缓冲区
for (int i = 0; i < size; i++) {
outBuf.put(inBuf.get());
} // 关闭(关闭通道时会写入数据块)
fcIn.close();
fcOut.close();
System.out.println("复制成功"); long end = System.currentTimeMillis();
System.out.println("总耗时:" + (end - start) + "ms");
} @Test
private static void copyFile(String src, String dest) throws Exception { long start = System.currentTimeMillis(); // 获得输入流输出流的文件通道
FileChannel fcIn = new FileInputStream(src).getChannel();
FileChannel fcOut = new FileOutputStream(dest).getChannel(); // 申请缓冲空间为1024个字节
ByteBuffer buf = ByteBuffer.allocate(1024);
while (fcIn.read(buf) != -1) {
buf.flip();
fcOut.write(buf);
//清除缓存
buf.clear();
} //关闭通道
fcIn.close();
fcOut.close();
System.out.println("复制成功"); long end = System.currentTimeMillis();
System.out.println("总耗时:" + (end - start) + "ms");
} }

比较IO操作的性能比较

  1. 内存映射最快
  2. NIO读写文件
  3. 加了缓存流的IO
  4. 普通IO(不加缓存流)

Java使用文件通道复制文件的更多相关文章

  1. Java IO流之【缓冲流和文件流复制文件对比】

    与文件流相比,缓冲流复制文件更快 代码: package Homework; import java.io.BufferedOutputStream; import java.io.File; imp ...

  2. Java IO和Java NIO 和通道 在文件拷贝上的性能差异分析

    1.  在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区 ...

  3. Java I/O流 复制文件速度对比

    Java I/O流 复制文件速度对比 首先来说明如何使用Java的IO流实现文件的复制: 第一步肯定是要获取文件 这里使用字节流,一会我们会对视频进行复制(视频为非文本文件,故使用之) FileInp ...

  4. Java基础之读文件——使用通道复制文件(FileBackup)

    控制台程序,除了使用Files类中使用copy()方法将文件复制外,还可以使用FileChannel对象复制文件,连接到输入文件的FileChannel对象能直接将数据传输到连接到输出文件的FileC ...

  5. Java NIO3:通道和文件通道

    通道是什么 通道式(Channel)是java.nio的第二个主要创新.通道既不是一个扩展也不是一项增强,而是全新的.极好的Java I/O示例,提供与I/O服务的直接连接.Channel用于在字节缓 ...

  6. Java NIO5:通道和文件通道

    一.通道是什么 通道式(Channel)是java.nio的第二个主要创新.通道既不是一个扩展也不是一项增强,而是全新的.极好的Java I/O示例,提供与I/O服务的直接连接.Channel用于在字 ...

  7. Java之字节流操作-复制文件

    package test_demo.fileoper; import java.io.FileInputStream; import java.io.FileOutputStream; import ...

  8. java: file/outputStream/InputStream 复制文件

    java i/o 复制文件 public static void main(String[] args) throws Exception { // TODO 自动生成的方法存根 if(args.le ...

  9. matlab_移动文件和复制文件

    clear clc cd('C:\Users\xx\Desktop\learning'); % 设置当前目录 % 此时learning文件夹中有:文件夹x, 文件夹y, 文件a.png, 文件b.pn ...

随机推荐

  1. datagrid选择一行

    onLoadSuccess:function(value, rec){ $("#sinopec_search_btn").linkbutton('enable'); var dat ...

  2. (转)Kubernetes部署WordPress+MySQL

    转:http://www.showerlee.com/archives/2336 这部分我们结合之前的k8s知识点给大家展示如何使用kubernetes部署wordpress+MySQL, 并利用NF ...

  3. Java 内部类“覆盖"

    Think in Java  P269 如果子类中的内部类和父类中内部类一样,这好像子类内部类“覆盖”了父类的内部类,但其实没有代表着什么. public class BigEgg extends E ...

  4. 云计算openstack共享组件——Memcache 缓存系统

    一.缓存系统 静态web页面: 1.工作流程: 在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Reques ...

  5. Cordova指令

      安装 cordova: npm install -g cordova 创建应用程序 cordova create hello com.example.hello HelloWorld cordov ...

  6. 编程语言-Python-GUI

    PyQt5 import sys from PyQt5 import QtWidgets,QtCore app = QtWidgets.QApplication(sys.argv) widget = ...

  7. std::map使用结构体自定义键值

    使用STL中的map时候,有时候需要使用结构题自定义键值,比如想统计点的坐标出现的次数 struct Node{ int x,y; }; ...... map<Node,int>mp; m ...

  8. springboot连接mysql报错:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException

    nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. ...

  9. jQuery DataTables 问题:Cannot reinitialise DataTable

    解决:  destroy: true, var tabel = $('#userlist').DataTable({        destroy: true,                    ...

  10. ubantu 安装软件

    一.解压后bin文件夹里有setup.py 进入到setup.py的目录,执行命令: sudo python3 setup.py install 二.以.whl结尾的文件 直接运行命令: sudo p ...