用不同的方法实现文件的复制

1. 通道

Channel,它是一个对象,可以通过它读取和写入数据。拿NIO与原来的I/O比较,通道就像是流。是对接操作系统底层和缓冲区的桥梁。

2. 性能比较

内存映射最快,其次是NIO读写文件,再其次是加了缓冲的IO流,最后是无缓冲的IO流

代码示例

import java.io.FileInputStream;
import java.io.FileNotFoundException;
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; public class ChannelDemo { public static void main(String[] args) {
copyFile();
randomAccessFileCopy();
} /**
* 使用内存映射实现文件的复制
*/
private static void randomAccessFileCopy() {
try {
RandomAccessFile in = new RandomAccessFile("F:/test.txt", "r");
RandomAccessFile out = new RandomAccessFile("F:/testbak2.txt", "rw"); FileChannel fcIn = in.getChannel();
FileChannel fcOut = out.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();
in.close();
out.close();
System.out.println("复制成功");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}// randomAccessFileCopy /**
* 通过文件通道实现文件复制
*/
private static void copyFile() {
try {
// 创建一个输入文件通道
FileChannel fcIn = new FileInputStream("F:/test.txt").getChannel();
// 创建一个输出文件通道
FileChannel fcOut = new FileOutputStream("F:/testbak.txt").getChannel(); ByteBuffer buf = ByteBuffer.allocate(1024);
while(fcIn.read(buf) != -1) {
buf.flip();
fcOut.write(buf);
buf.clear();// 清空缓冲区
} fcOut.close();
fcIn.close();
System.out.println("复制成功");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}// copyFile }

Java 实现文件复制的不同方法的更多相关文章

  1. Java实现文件复制的四种方式

    背景:有很多的Java初学者对于文件复制的操作总是搞不懂,下面我将用4中方式实现指定文件的复制. 实现方式一:使用FileInputStream/FileOutputStream字节流进行文件的复制操 ...

  2. java中文件复制的4种方式

    今天一个同事问我文件复制的问题,他一个100M的文件复制的指定目录下竟然成了1G多,吓我一跳,后来看了他的代码发现是自己通过字节流复制的,定义的字节数组很大,导致复制后目标文件非常大,其实就是空行等一 ...

  3. java多种文件复制方式以及效率比较

    1.背景 java复制文件的方式其实有很多种,可以分为 传统的字节流读写复制FileInputStream,FileOutputStream,BufferedInputStream,BufferedO ...

  4. java实现文件复制粘贴功能

    java编程思想中讲到了IO流的思想,以前对于java基础总是不够深入,浅尝辄止,如今碰到语句插桩的时候就感到书到用时方恨少啊! 文件的复制涉及到源文件和新文件(无需手动创建),给出源文件的路径和文件 ...

  5. Java字节流文件复制

    1.字节流 在 Java 中,文件的复制使用字节输入流和字节输出流实现,java.io 包有 InputStream 和 OutputStream 这两个顶层抽象类规范了读写文件所需的核心 API. ...

  6. 【java】文件复制的简单实现

    package 文件操作; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...

  7. java IO 文件复制代码模型

    package com.xjtu.demo; import java.io.*; public class FileCopy { public static void main(String[] ar ...

  8. Java实现文件复制

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * & ...

  9. Java处理 文件复制

    try { InputStream in = new FileInputStream(new File(oldPath)); OutputStream out = new FileOutputStre ...

随机推荐

  1. 【HDOJ6667】Roundgod and Milk Tea(模拟)

    题意:有n个班级,每个班级有a[i]个人,b[i]杯奶茶 每个人至多喝一杯奶茶,且不能喝自己班的 问能喝到奶茶的最多总人数 n<=1e6,a[i],b[i]<=1e9 思路: 做法一: # ...

  2. PHP Timer 页面运行时间监测类

    转至:http://blog.csdn.net/fdipzone/article/details/20160567 php Timer 页面运行时间监测类,可按不同key监测不同的运行时间 Timer ...

  3. 洛谷P1462 通往奥格瑞玛的道路(二分+spfa,二分+Dijkstra)

    洛谷P1462 通往奥格瑞玛的道路 二分费用. 用血量花费建图,用单源最短路判断 \(1\) 到 \(n\) 的最短路花费是否小于 \(b\) .二分时需要不断记录合法的 \(mid\) 值. 这里建 ...

  4. day09—css布局解决方案之全屏布局

    转行学开发,代码100天——2018-03-25 今天,本文记录全屏布局的的方法.全屏布局,即滚动条不是全局滚动条,而是出现在内容区域内,:浏览器变大时,撑满窗口. 如:设置下图中布局,其中top区, ...

  5. LATERAL VIEW 语法

    LATERAL VIEW 使用语法 原文链接: https://www.deeplearn.me/2892.html select a.id, b.son_order_path from f_jz_c ...

  6. PHP 数组函数-数组排序

    php数组排序函数sort ( &$arr [,fruits] ) 对数组进行从低到高排序 ,并赋予新的键名 返回boolrsort ( &$arr [,fruits] ) 对数组进行 ...

  7. excel wps access mysql数据表格的查询之路

    简直血崩,最近去做兼职,每天都有大量的表格数据要整理. 开始 还是 用 excel的用起来还算顺畅,慢慢慢慢的发现了各种弊端.大概类似于分组排序什么什么的好多啦~~~不过也确实是用了不到两个小时就能比 ...

  8. debian7下安装eclipse

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

  9. (转载)Spring与SpringMVC父子容器的关系与初始化

    转自 https://blog.csdn.net/dhaiuda/article/details/80026354 Spring和SpringMVC的容器具有父子关系,Spring容器为父容器,Spr ...

  10. SQL常用语句之数据库数据类型-篇幅2

    系统数据类型: 1.二进制数据类型      2.整数数据类型 3.浮点数据类型         4.精确小数数据类型 5.货币数据类型         6.日期/时间数据类型 7.字符数据类型    ...