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

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. Curl命令、Elinks命令、lynx命令、Wget命令、lftp命令

    一.Curl命令 语法 curl(选项)(参数) 选项 -a/--append 上传文件时,附加到目标文件 -A/--user-agent <string> 设置用户代理发送给服务器 -a ...

  2. [CSP-S模拟测试]:Market(背包DP)

    题目描述 在比特镇一共有$n$家商店,编号依次为$1$到$n$.每家商店只会卖一种物品,其中第$i$家商店的物品单价为$c_i$,价值为$v_i$,且该商店开张的时间为$t_i$. $Byteasar ...

  3. html from表单异步处理

    from表单异步处理. 简单处理方法: jQuery做异步提交表单处理, 通过$("#form").serialize()将表单元素的数据转化为字符串, 最后通过$.ajax()执 ...

  4. laravel5.6 操作数据 Eloquent ORM

    建立Users模型 <?php namespace App\Model\Eloquent\Admin; use Illuminate\Database\Eloquent\Model; class ...

  5. 【前端技术】一篇文章搞掂:uni-app

    语法 //列表遍历,遍历数组,第一个参数为数组中元素,可以给第二个参数作为索引值 <view v-for="(item, itemIndex) in card" :key=& ...

  6. php面试专题---8、会话控制考点

    php面试专题---8.会话控制考点 一.总结 一句话总结: 主要是cookie和session的区别,以及用户禁用cookie之后怎么使用session 1.为什么要使用会话控制技术? 因为http ...

  7. python web自动化测试框架搭建(功能&接口)——接口用例实现

    测试用例基类: # coding=utf-8 import unittest import Logger log = Logger.Loger() class BaseCase(unittest.Te ...

  8. 校内模拟赛 : Rima —— 字典树+树形DP

    首先说一下,对一个刚学Trie树的蒟蒻来说(就是我),这道题是一道好题.Trie树比较简单,所以就不详细写了. Rima 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传 ...

  9. 深入探讨vue响应式原理

    现在是时候深入一下了!Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是普通的 JavaScript 对象.而当你修改它们时,视图会进行更新.这使得状态管理非常简单直接,不过理解其工作 ...

  10. servlet--获取类路径下资源

     context 获取真实路径(*****) 还可以使用ServletContext对象来获取Web应用下的资源,例如在hello应用的根目录下创建a.txt文件,现在想在Servlet中获取这个资源 ...