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

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. Xcode编辑器之快捷键的使用

    一,快捷键图标 图标 键盘 ⌘ Command ⌃ Control ⌥ Option ⇧ Shift 二, 常用快捷键 文件快捷键 快捷键 键盘  描述 ⌘N  command + N 新文件 ⇧⌘N ...

  2. redis测试

    1,安装redis软件 2,引入redis jar包 3,案例 package test; import java.util.List; import redis.clients.jedis.Jedi ...

  3. 170817关于JSON知识点

    1.  JSON                [1] JSON简介                         JSON全称 JavaScript Object Notation         ...

  4. windown 使用python 自动切换网络

    由于工作环境的特殊性,有时需要切换到内网工作,有时需要通过手机连接外网,想自动运行一个脚本就做完这事 首先在PC机上安装一个无线网卡,例如360wifi就可以. 除了python,还用到了DOS命令, ...

  5. Share架构的一些心得

    个人这些年,从web->system service->app 项目实战,陆陆续续经历的项目很多,自己也数不清.自己也一直对于架构没有明确去给出一个自己的定义描述. 刚好最近一直在flut ...

  6. JavaScript中的十种操作符

    ①   一元操作符(参与的只有一个变量) 前置递增递减(语句解析到递增/递减时值就被改变了) 后置递增递减(整个语句执行后值再改变) 递增递减也可用于字符串,布尔值,对象等,结果都将是数值:   ;v ...

  7. rap安装mysql

    1.yum仓库下载MySQL: yum localinstall https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm ...

  8. debian7下安装eclipse

    apt-get install build-essential 完成后从eclipse官网上下载C++专用的版本,直接解压缩即可

  9. Waiter.js

    var Waiter = function() {     var dfd = [],         doneArr = [],         failArr = [],         slic ...

  10. Jmeter-后置处理器(Json extractor)

    后置处理器-json extractor 概念:顾名思义,提取json响应的数据中提取数据: 步骤:sampler-后置处理器-jsonextractor 1.提取单个参数 1.Variable na ...