java用线程实现复制文件:就是复制大文件时,用多个线程把大文件分成小文件,实现快速复制。

java用线程实现复制文件:就是复制大文件时,用多个线程把大文件分成小文件,实现快速复制。,第1张

package DuoXianCheng

import java.io.BufferedReader

import java.io.File

import java.io.FileInputStream

import java.io.FileOutputStream

import java.io.InputStream

import java.io.InputStreamReader

import java.io.OutputStream

import java.io.OutputStreamWriter

import java.io.Reader

public class CopyFile implements Runnable {

public synchronized void run(){

try {

InputStream is=

new FileInputStream("f:"+File.separator+"file1"友掘+File.separator+"321.txt")

Reader rd=new InputStreamReader(is,"gbk")

BufferedReader br=new BufferedReader(rd)

OutputStream os=

new FileOutputStream("f:"+File.separator+"好唤核file1"+File.separator+"1234.txt")

OutputStreamWriter osw=new OutputStreamWriter(os,"gbk")

String str=""

while((str=br.readLine())!=null){

osw.write(str)

System.out.println(str)

}

osw.close()

br.close()

os.close()

rd.close()

is.close()

System.out.println(Thread.currentThread().getName()+"链友:复制完毕")

} catch (Exception e) {

e.printStackTrace()

}

}

}

主函数:

package DuoXianCheng

import java.util.concurrent.ExecutorService

import java.util.concurrent.Executors

public class CopyFileText {

public static void main(String[] args) {

CopyFile cf=new CopyFile()

ExecutorService es=

Executors.newFixedThreadPool(3)

es.execute(cf)

es.execute(cf)

es.execute(cf)

es.shutdown()

}

}

尽管Java提供了 java.io.File 这样一个 *** 作文件的类,但并没有提供一个复制文件的方法

然而,当我们需要对磁盘上的文件进行处理的时候,这是一个很重要的方法。在这个时候我们往往不得不自己实现这样一个完成文件复制 *** 作的方法。下面将会介绍4种常见的文件复制的实现,并比较下它们的性能。

能找到的最常见经典例子。从文件A的输入流读取一批字节,写到文件B的输出流。

如你所见,这种实现方式需要多次读取数据,再写入将数据写入,因此受限于我们提供的buffer的大小,他的效率有点一般。

Java NIO类库里引入了一个叫 transferFrom 的方法,文档里说这是一个会比 FileStream 方式更快的复制 *** 作。

Appache Commons IO 提供了一旅镇个 FileUtils.copyFile(File from, File to) 方法用于文件复制,如果项目里使用到了这个类库,使用这个方法是个不错的选择。它的内部也是使用Java NIO的 FileChannel 实现的。

如果对Java 7 的使用有经验的话,那应该接触过 Files 这个工具类。

由于项目里没用到 Apache Common IO ,Android仅支持 Java 7 的语法特性,因此我只测试了前两种,数据如下:

复制文件,大小2M

复制文件,大小4.5M

复制文件,大小8M

复制文件,大小161M

从数据上可以看出,使用 FileStream 的方式,复制的效率跟我们的buffer大小取值关系很大,这无疑加大了我们使用它进行文件复制的负担。

而NIO的方式则不然模镇孙,无论是小文件、还是大文件,它的效率旦链都跟我们测试 FileStream 的最好水平相当!

因此,把 FileStream 这种老旧的实现方式从项目里挪走吧,是时候用上 FileChannel 了。

2016年06月16日 14:04 更新

大致就是从输入里映射一部分作为buffer,写到输出去,Buffer的大小最大为8388608,如果剩余的文件长度小于这个值,则用剩余文件长度的大小为buffer大小,继续写入,直到完全写完。

需要注意到的是,buffer并不是我们平时使用的byte数组,而是 MappedByteBuffer 对象,这是 java nio 引入的文件内存映射方案,读写性能很高。

不能复制出来???你文件多大的 如果是小文件 只要路径没错copyfile (pchar(s+'\Student.mdf'),pchar('d:\student.mdf'),false) 肯定是可以的 如果是猜启蠢大文件建议你调用WINDOS自带的拷贝命令~~~

//uses ShellAPI

//AFileSrc:源文件(可以是一个或几个文件、或是通配符、或是目录名),

/旁培/AFileDes:目标文件或目录名

function ShellCopyFile(const AFileSrc, AFileDes: string): boolean

var

fo: TSHFILEOPSTRUCT

begin

FillChar(fo, SizeOf(fo), 0)

with fo do

begin

Wnd := 0

wFunc := FO_COPY

pFrom := PChar(AFileSrc)

pTo := PChar(AFileDes)

fFlags := FOF_ALLOWUNDO

end

Result := (SHFileOperation(fo) = 0)

end

如果穗陪还不行 请你先showmessage(s+'\Student.mdf'),检查下路径 是否正确~


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8209443.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存