Java使用文件通道复制文件
两种文件通道复制文件方式的性能比较
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操作的性能比较
- 内存映射最快
- NIO读写文件
- 加了缓存流的IO
- 普通IO(不加缓存流)
Java使用文件通道复制文件的更多相关文章
- Java IO流之【缓冲流和文件流复制文件对比】
与文件流相比,缓冲流复制文件更快 代码: package Homework; import java.io.BufferedOutputStream; import java.io.File; imp ...
- Java IO和Java NIO 和通道 在文件拷贝上的性能差异分析
1. 在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区 ...
- Java I/O流 复制文件速度对比
Java I/O流 复制文件速度对比 首先来说明如何使用Java的IO流实现文件的复制: 第一步肯定是要获取文件 这里使用字节流,一会我们会对视频进行复制(视频为非文本文件,故使用之) FileInp ...
- Java基础之读文件——使用通道复制文件(FileBackup)
控制台程序,除了使用Files类中使用copy()方法将文件复制外,还可以使用FileChannel对象复制文件,连接到输入文件的FileChannel对象能直接将数据传输到连接到输出文件的FileC ...
- Java NIO3:通道和文件通道
通道是什么 通道式(Channel)是java.nio的第二个主要创新.通道既不是一个扩展也不是一项增强,而是全新的.极好的Java I/O示例,提供与I/O服务的直接连接.Channel用于在字节缓 ...
- Java NIO5:通道和文件通道
一.通道是什么 通道式(Channel)是java.nio的第二个主要创新.通道既不是一个扩展也不是一项增强,而是全新的.极好的Java I/O示例,提供与I/O服务的直接连接.Channel用于在字 ...
- Java之字节流操作-复制文件
package test_demo.fileoper; import java.io.FileInputStream; import java.io.FileOutputStream; import ...
- java: file/outputStream/InputStream 复制文件
java i/o 复制文件 public static void main(String[] args) throws Exception { // TODO 自动生成的方法存根 if(args.le ...
- matlab_移动文件和复制文件
clear clc cd('C:\Users\xx\Desktop\learning'); % 设置当前目录 % 此时learning文件夹中有:文件夹x, 文件夹y, 文件a.png, 文件b.pn ...
随机推荐
- BZOJ 2729: [HNOI2012]排队 排列组合 + 高精度
Description 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不 ...
- 一道装呀(状压)DP
generator 题目描述: 自己的数学太差了,居然没看出来和这两个是相同的: 啊啊啊: 所以装呀一下就好了: #include<iostream> #include<cstdio ...
- <R语言编程艺术>的一个错误以及矩阵相加
R语言编程艺术讲矩阵这节时,举了个随机噪声模糊罗斯福总统画像的例子.但是里面似乎有个错误,例子本意是区域外的值保持不变,而选定区域的值加一个随机值,但是实际情况是两个行列不相等的矩阵相加,会报错,如果 ...
- Flask学习 4 http方法
服务端端 #!/usr/bin/env python # encoding: utf-8 """ @version: v1.0 @author: cxa @file: f ...
- AtCoder Grand Contest 012 B - Splatter Painting(dp)
Time limit : 2sec / Memory limit : 256MB Score : 700 points Problem Statement Squid loves painting v ...
- 使用代理IP、高匿IP、连接失败
先百度一下,什么是代理IP 我们使用代理IP就是因为某些站点会屏蔽我们的IP,所以我们要动态的更换代理IP. 代理IP: 其中我们首先选择国内的IP,国外的一般都比较慢,其次不要选择如{新疆乌鲁木齐} ...
- (appium+python)UI自动化_07_app UI自动化实例【叮咚搜索加车为例】
前言 初学UI自动化的小伙伴,在配置好appium+python自动化环境后,往往不知道如何下手实现自动化.小编在初期学习的时候也有这种疑惑,在此以叮咚买菜app-搜索加车为实例,展示下appium是 ...
- LeetCode 230. Kth Smallest Element in a BST 动态演示
返回排序二叉树第K小的数 还是用先序遍历,记录index和K进行比较 class Solution { public: void helper(TreeNode* node, int& idx ...
- VS代码自动补全功能
VS代码自动补全功能 新建工程后,依次打开 工具>>代码段管理器>>选择C++>>点击 添加(A)...按钮 ,设置你的代码块的目录 复制以下代码并存为note.s ...
- String.prototype.includes
if (!String.prototype.includes) { String.prototype.includes = function(search, start) { 'use s ...