`
44424742
  • 浏览: 235478 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

文件拷贝

阅读更多

使用 java 进行文件拷贝 相信很多人都会用,,不过效率上是否最好呢?
最近看了看NIO决定试一试 java NIO 到底有什么性能的提升.

第一种方法:古老的方式

public static long forJava(File f1,File f2) throws Exception{
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
FileOutputStream out=new FileOutputStream(f2);
byte[] buffer=new byte[length];
while(true){
int ins=in.read(buffer);
if(ins==-1){
in.close();
out.flush();
out.close();
return new Date().getTime()-time;
}else
out.write(buffer,0,ins);
}
}
方法的2参数分别是原始文件,和拷贝的目的文件.这里不做过多介绍.

实现方法很简单,分别对2个文件构建输入输出流,并且使用一个字节数组作为我们内存的缓存器, 然后使用流从f1 中读出数据到缓存里,在将缓存数据写到f2里面去.这里的缓存是2MB的字节数组

第2种方法:使用NIO中的管道到管道传输

public static long forTransfer(File f1,File f2) throws Exception{
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
FileOutputStream out=new FileOutputStream(f2);
FileChannel inC=in.getChannel();
FileChannel outC=out.getChannel();
int i=0;
while(true){
if(inC.position()==inC.size()){
inC.close();
outC.close();
return new Date().getTime()-time;
}
if((inC.size()-inC.position())<20971520)
length=(int)(inC.size()-inC.position());
else
length=20971520;
inC.transferTo(inC.position(),length,outC);
inC.position(inC.position()+length);
i++;
}
}
实现方法:在第一种实现方法基础上对输入输出流获得其管道,然后分批次的从f1的管道中像f2的管道中输入数据每次输入的数据最大为2MB

方法3:内存文件景象写(读文件没有使用文件景象,有兴趣的可以回去试试,,我就不试了,估计会更快)

public static long forImage(File f1,File f2) throws Exception{
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
RandomAccessFile out=new RandomAccessFile(f2,"rw");
FileChannel inC=in.getChannel();
MappedByteBuffer outC=null;
MappedByteBuffer inbuffer=null;
byte[] b=new byte[length];
while(true){
if(inC.position()==inC.size()){
inC.close();
outC.force();
out.close();
return new Date().getTime()-time;
}
if((inC.size()-inC.position())<length){
length=(int)(inC.size()-inC.position());
}else{
length=20971520;
}
b=new byte[length];
inbuffer=inC.map(MapMode.READ_ONLY,inC.position(),length);
inbuffer.load();
inbuffer.get(b);
outC=out.getChannel().map(MapMode.READ_WRITE,inC.position(),length);
inC.position(b.length+inC.position());
outC.put(b);
outC.force();
}
}
实现方法:跟伤2个例子不一样,这里写文件流没有使用管道而是使用内存文件映射(假设文件f2在内存中).在循环中从f1的管道中读取数据到字节数组里,然后在像内存映射的f2文件中写数据.

第4种方法:管道对管道

public static long forChannel(File f1,File f2) throws Exception{
long time=new Date().getTime();
int length=2097152;
FileInputStream in=new FileInputStream(f1);
FileOutputStream out=new FileOutputStream(f2);
FileChannel inC=in.getChannel();
FileChannel outC=out.getChannel();
ByteBuffer b=null;
while(true){
if(inC.position()==inC.size()){
inC.close();
outC.close();
return new Date().getTime()-time;
}
if((inC.size()-inC.position())<length){
length=(int)(inC.size()-inC.position());
}else
length=2097152;
b=ByteBuffer.allocateDirect(length);
inC.read(b);
b.flip();
outC.write(b);
outC.force(false);
}
}
这里实现方式与第3种实现方式很类似,不过没有使用内存影射.

下面是对49.3MB的文件进行拷贝的测试时间(毫秒)

Start Copy File... file size:50290KB
CopyFile:b1.rmvb mode:forChannel RunTime:3203
CopyFile:b1.rmvb mode:forImage RunTime:3328
CopyFile:b1.rmvb mode:forJava RunTime:2172
CopyFile:b1.rmvb mode:forTransfer RunTime:1406
End Copy File!

解释: 在测试结果中看到 古老方式,和管道向管道传输是最快的,,,,,为什么呢?

我分析是这样的,由于另外2种方法内部都使用了 字节数组作为缓存中转,在加上NIO内部有一个贴近系统的缓存区,这无意就增加了另一个缓存器,所以相对于这2个方法就要慢许多,,如果不使用 字节数组作为数据中转的话相信速度会更快的..

不过比较惊讶的是 管道向管道传输的速度还是真挺吓人,,,

我的机器是 IDE硬盘120G 硬盘缓存2MB, 内存1GB, CPU AMD2800+

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ta8210/archive/2008/01/30/2073817.aspx

分享到:
评论

相关推荐

    大名鼎鼎的小文件拷贝工具

    在信息技术高速发展的今天,文件拷贝的需求在各个领域无处不在。无论是数据备份、资料转移还是系统迁移,快速高效地处理文件拷贝任务都显得尤为重要。尤其是对于那些包含大量小文件的场景,传统的单线程拷贝方式效率...

    Qt 文件拷贝带进度条显示

    **Qt 文件拷贝带进度条显示** 在编程领域,特别是在GUI(图形用户界面)开发中,用户界面的反馈至关重要。当涉及到大文件的复制或移动时,提供一个进度条可以显著提升用户体验,让用户知道操作正在进行并估计剩余...

    Linux下C语言实现文件拷贝

    ### Linux下C语言实现文件拷贝 #### 一、引言 在计算机编程领域,特别是在系统级编程中,文件操作是非常基础且重要的功能之一。在Linux环境下,利用C语言进行文件操作具有高度的灵活性和效率。本文将详细介绍如何在...

    Qt实现文件拷贝

    在本文中,我们将深入探讨如何使用Qt框架在C++中实现多线程文件拷贝功能。Qt是一个跨平台的应用程序开发框架,它提供了丰富的API来处理文件操作和多线程编程,使得我们可以方便地实现高效的文件复制任务。 首先,...

    文件拷贝辅助工具源码

    《文件拷贝辅助工具源码解析与应用》 在日常工作中,我们经常需要进行大量文件的复制和移动操作,尤其在处理大型项目或数据迁移时,手动操作既耗时又容易出错。针对这一需求,一种名为“文件拷贝辅助工具”的程序...

    MFC文件拷贝程序MFC文件拷贝程序

    要实现文件拷贝,我们需要创建两个CFile对象,分别对应源文件和目标文件,然后通过读取源文件并写入目标文件来完成拷贝过程。 首先,我们需要打开源文件。可以使用CFile的成员函数Open(),传入文件路径和访问模式。...

    mfc文件浏览器实现文件拷贝功能多线程

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 框架来实现一个文件浏览器,并且重点讲解如何在其中实现文件拷贝功能,同时利用多线程技术提高程序性能。MFC 是 Microsoft 提供的一个C++库,它...

    Linux系统U盘自动识别与文件拷贝

    在Linux系统中,U盘的自动识别和文件拷贝是一个常见的需求,特别是在自动化运维和数据传输的场景下。本文将详细解析"Linux系统U盘自动识别与文件拷贝"的相关知识点,通过源码udisk.c和udisk.h来探讨实现这一功能的...

    Android 文件拷贝Demo

    Android 文件拷贝Demo,可实现SD卡以及内部存储之间进行拷贝

    Super File Copying 超级文件拷贝机

    一个强大的文件拷贝/坏区恢复工具,可以实现拷贝坏区文件、合并文件、测试文件拷贝速度的有效工具。 你遇到过下面的问题吗? 1.你的文件有坏区;2.你的文件被截断了;3.你需要合并同一个文件...... 当你的...

    C# 黑马.Net_大文件拷贝实例源码

    大文件拷贝实例源码,学习关于IO文件流、多线程相关使用做参考。 private void button4_Click(object sender, EventArgs e) { this.progressBar1.Value = 0; this.label1.Text = "0%"; if (!File.Exists(this....

    一个控制文件拷贝速度的java程序

    标题中的“一个控制文件拷贝速度的java程序”指的是一个Java程序,它的主要功能是管理文件复制过程的速度,可能是为了防止硬盘过载、优化系统资源使用或者确保数据传输的稳定性。这种程序通常会通过设置一定的速率...

    qt下文件拷贝函数

    不错的使用qt编程实现文件拷贝,初学者可以借鉴哦!

    fastcopy日本最快文件拷贝工具

    Fastcopy是日本的最快的文件拷贝工具。磁盘间相互拷贝文件是司空见惯的事情,通常情况都是利用WINDOWS自带的复制粘贴功能来实现的。这样做在数目较小的情况下倒也没什么问题,但是数目较大时,系统自带的复制功能就...

    光盘坏文件拷贝器V2.1

    《光盘坏文件拷贝器V2.1:探索数据恢复与备份的奥秘》 在数字信息的时代,光盘作为一种存储介质,虽然已经被硬盘、U盘和云存储等更现代的技术所替代,但仍然在某些领域发挥着不可忽视的作用。然而,随着时间的推移...

    文件拷贝(将文件从A路径拷贝到B路径)

    实现不同路径文件的拷贝,输入参数a(带拷贝的文件路径)b(拷贝文件的目标路径)。

    VS2010实现文件拷贝并显示进度条

    在本文中,我们将深入探讨如何使用Visual Studio 2010来实现文件拷贝功能,并在拷贝过程中显示一个进度条以提供用户友好的界面体验。这个实现主要涉及MFC(Microsoft Foundation Classes)库,以及Windows API中的...

    用java实现文件拷贝

    Java实现文件拷贝的小程序 本资源是一个使用Java语言实现文件拷贝的小程序,具有很实用的功能。下面是对这个小程序的详细解释和知识点总结: 文件拷贝的基本概念 文件拷贝是将一个文件的内容复制到另一个文件中,...

    第12讲 Java有几种文件拷贝方式?哪一种最高效?1

    在Java编程中,文件拷贝是一项常见的操作,有多种实现方式。本节主要讨论了三种典型的方法,并探讨了它们的效率和底层实现机制。 首先,Java.IO类库提供了一种基于`FileInputStream`和`FileOutputStream`的文件拷贝...

    文件拷贝演示 多线程实现拷贝进度条

    文件拷贝演示 多线程实现拷贝进度条

Global site tag (gtag.js) - Google Analytics