闲来无聊,对比下新旧IO复制文件的性能,贴代码了:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
import org.junit.Test;
public class FileCopyTest{
private File f1 = new File("d:\\temp\\bigfile.rar");//2.8G
@Test
/**
* 内存文件映像方式
*/
public void testMappedByteBuffer() throws Exception {
long time = System.currentTimeMillis();
File f2 = new File("d:\\temp\\1.rar");
if (f2.exists()) {
f2.delete();
} else {
f2.createNewFile();
}
FileInputStream fin = new FileInputStream(f1);
FileOutputStream fos = new FileOutputStream(f2);
FileChannel finc = fin.getChannel();
FileChannel fosc = fos.getChannel();
long length = f1.length();
long size = 1024*1024*10;//10M
long position = 0;
MappedByteBuffer mbb = null;
while(position<length){
long readLength = size;
if(position+size>length){
readLength = length - position;
}
mbb = finc.map(MapMode.READ_ONLY, position, readLength);
fosc.write(mbb);
fosc.force(true);//强制读取数据磁盘写操作
mbb.clear();
position += readLength;
}
fosc.close();
finc.close();
fos.close();
fin.close();
time = System.currentTimeMillis() - time;
System.out.println("MappedByteBuffer cost time(ms)=" + time);
}
@Test
/**
* 旧的IO方式
*/
public void testOldIO() throws Exception {
long time = System.currentTimeMillis();
File f2 = new File("d:\\temp\\2.rar");
if (f2.exists()) {
f2.delete();
} else {
f2.createNewFile();
}
FileInputStream fin = new FileInputStream(f1);
FileOutputStream fos = new FileOutputStream(f2);
byte[] b = new byte[1024 * 1024*10];
int count=-1;
while ((count = fin.read(b)) != -1) {
fos.write(b,0,count);
}
fos.close();
fin.close();
time = System.currentTimeMillis() - time;
System.out.println("old I/O cost time(ms)=" + time);
}
@Test
/**
* 管道与管道方式
*/
public void testTransfer() throws Exception {
long time = System.currentTimeMillis();
File f2 = new File("d:\\temp\\3.rar");
if (f2.exists()) {
f2.delete();
} else {
f2.createNewFile();
}
FileInputStream fin = new FileInputStream(f1);
FileOutputStream fos = new FileOutputStream(f2);
FileChannel finc = fin.getChannel();
FileChannel fosc = fos.getChannel();
long length = f1.length();
long size = 1024*1024*10;//10M
long position = 0;
while(position<length){
long readLength = size;
if(position+size>length){
readLength = length - position;
}
finc.transferTo(position, readLength, fosc);
fosc.force(true);//强制读取数据磁盘写操作
position += readLength;
}
fosc.close();
finc.close();
fos.close();
fin.close();
time = System.currentTimeMillis() - time;
System.out.println("Transfer cost time(ms)=" + time);
}
@Test
/**
* 管道与管道方式(使用直接缓存)
*/
public void testChannel() throws Exception{
long time= System.currentTimeMillis();
File f2 = new File("d:\\temp\\4.rar");
if (f2.exists()) {
f2.delete();
} else {
f2.createNewFile();
}
FileInputStream fin = new FileInputStream(f1);
FileOutputStream fos = new FileOutputStream(f2);
FileChannel finc = fin.getChannel();
FileChannel fosc = fos.getChannel();
ByteBuffer b= ByteBuffer.allocateDirect(1024*1024*10);
while(finc.read(b)!=-1){
b.flip();
fosc.write(b);
fosc.force(false);
b.clear();
}
fosc.close();
finc.close();
fos.close();
fin.close();
time = System.currentTimeMillis() - time;
System.out.println("Channel cost time(ms)=" + time);
}
}
测试结果:
MappedByteBuffer cost time(ms)=105862
old I/O cost time(ms)=111174
Transfer cost time(ms)=119248
Channel cost time(ms)=111386
分享到:
相关推荐
本文将详细介绍四种常见的Java文件复制方法:使用`FileStreams`、使用`FileChannel`、使用Apache `Commons IO`以及使用Java 7的`Files`类。 #### 1. 使用`FileStreams`复制文件 这种方法是最传统的文件复制手段,...
java实现excel表格文件的复制,测试可用,将excel表格的表头和内容拷贝到新表中
以下是一个简单的文件复制方法: ```java import java.io.*; public class FileCopy { public static void copyFile(String sourcePath, String destPath) { try (FileInputStream fis = new FileInputStream...
在提供的压缩包子文件`StreamDemo_01.java`中,可能包含了关于使用`InputStream`和`OutputStream`进行文件操作的示例代码,而`Java.jpg`则可能是一个实际的图像文件,用于演示文件复制操作。在实际开发中,我们可以...
本篇文章将详细讲解如何使用Java的IO流进行文件复制,以及如何实现整个文件夹的复制,并检查复制是否成功。 1. 单个文件复制: 在Java中,我们可以使用`java.io`包中的`FileInputStream`和`FileOutputStream`类来...
Java计算文件MD5值(支持大文件) package com.hthl.xxtd; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.security.MessageDigest; import org....
这个"java文件流学习实验"显然是一系列用Java编写的实验,目的是深入理解和掌握文件流的概念和应用。实验中的代码文件(Test11.java、Test12.java等)很可能包含了不同类型的文件流操作示例,如读取、写入、复制和...
5. **多线程**: 如果文件数量很大,复制过程可能需要较长的时间,为避免阻塞用户界面,可以考虑使用`java.util.concurrent`包中的线程池或`SwingWorker`来异步执行文件复制任务。这样,用户界面仍能保持响应,同时...
在Java编程语言中,实现对本地文件的简单监控是一项实用的技术,这可以帮助开发者在文件系统中检测到诸如移动、复制和粘贴等操作。本文将深入探讨如何利用Java的文件I/O API和事件监听机制来达成这个目标。 首先,...
以下是一个简单的文件复制方法: ```java import java.io.*; public class CopyFile { public static void main(String[] args) { String sourcePath = "源文件路径"; String destPath = "目标文件路径"; try...
本篇将详细讲解标题为"完整的java文件读写工具类"所涉及的核心知识点,以及如何实现描述中提到的文件与目录管理功能。 1. **Java IO基础**: Java IO是Java标准库中的核心部分,提供了处理输入/输出流的类。在`...
综上所述,Java中的文件操作涵盖了从简单的输入输出到复杂的文件复制与写入等功能,提供了丰富的API和工具类来满足不同场景下的需求。理解并掌握这些操作,对于开发基于Java的应用程序,尤其是在处理大量文件或进行...
在给定的标题“java文件操作”中,我们可以深入探讨Java如何处理这些操作,并通过描述中的链接(虽然此处为空)推测我们将关注实际的代码示例。以下是对Java文件操作的详尽解析: 首先,Java提供了`java.io`包,...
这些工具不仅可以编译代码,还可以处理资源文件的复制、测试的运行、依赖库的下载等。 4. **JAR文件**:Java Archive (JAR) 文件是Java程序最常见的打包形式。JAR文件将多个.class文件和资源文件打包在一起,并可以...
【标签】"java小实验"表明这是一个学习或实践Java的项目,可能适合初学者用来加深对Java文件操作的理解。这个实验可以帮助开发者掌握Java的IO流操作,理解命令行参数的处理,并锻炼问题解决和调试技能。 在提供的...
6. 文件复制:将源文件的内容复制到目标文件,可能需要处理文件重名的情况。 7. 文件查找:根据文件名在文件系统中搜索指定文件。 8. 文件编辑:读取文件内容,允许用户修改,然后保存更改。 `FileModel.java`文件...
程序测试可用,直接解压导入到工程就可以,bat文件跟shell文件是用于在window跟linux上直接执行的脚本 我把开发的配置文档附上: 1.程序为定时任务,任务执行时间在bin目录下的配置文件mergeFilleUtil.properties中...
- `Files`类(在`java.nio.file`包中)提供了许多静态方法,可以直接进行文件操作,如复制、移动、删除等。 - 如果需要处理二进制文件,可以使用`FileInputStream`和`FileOutputStream`,配合`DataInputStream`和`...