有些开发的时候我们经常遇到这样一个问题,对大文件的处理。比如:日志文件。那么十几G的大文件。我们应该如何复制呢?

还有就是希望从本地和远程复制文件,文件都很大,10G级的如何办呢?

在这里我告诉你们,可以用java多线程实现复制。

原理:就是多线程把大文件分成小文件,实现快速复制。

下面直接看代码:

package com.huojg.test;

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; /**
* java用线程实现复制文件:就是复制大文件时,用多个线程把大文件分成小文件,实现快速复制
*
*
* */
public class CopyFile implements Runnable{ @Override
public synchronized void run() {
InputStream is;
try {
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 com.huojg.test;

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();
}
}

这样子我们的多线程就完成了。

下面说一下线程池:

3、在使用线程池之前,必须知道如何去创建一个线程池,在Java5中,需要了解java.util.concurrent.Executors类的API,这个类提供大量创建连接池的静态方法,是必须掌握的。

一、固定大小的线程池,newFixedThreadPool:

  1. 创建一个可重用固定线程数的线程池
  2. ExecutorService pool = Executors.newFixedThreadPool(5);
  3. 然后将线程放入池中进行执行
  4. 关闭线程池  pool.shutdown();

二、单任务线程池,newSingleThreadExecutor:

每次调用execute方法,其实最后都是调用了thread-1的run方法。

三、可变尺寸的线程池,newCachedThreadPool:

这种方式的特点是:可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。

四、延迟连接池,newScheduledThreadPool:

 // 创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);
// 创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口
Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
// 将线程放入池中进行执行
pool.execute(t1);
// 使用延迟执行风格的方法
pool.schedule(t2, 1000, TimeUnit.MILLISECONDS);
pool.schedule(t3, 10, TimeUnit.MILLISECONDS); // 关闭线程池
pool.shutdown();
ExecutorService:是一个接口,继承了Executor:
Executor:而Executor亦是一个接口,该接口只包含了一个方法:
void execute(Runnable command);

newFixedThreadPool()

创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程

 

java多线程实现复制大文件的更多相关文章

  1. C# FileStream复制大文件

    即每次复制文件的一小段,以节省总内存开销.当然,本机复制也可以采用.NET内部的System.IO.File.Copy方法. 本文转载:http://www.cnblogs.com/wolf-sun/ ...

  2. 【Web应用】JAVA网络上传大文件报500错误

    问题描述 当通过 JAVA 网站上传大文件,会报 500 错误. 问题分析 因为 Azure 的 Java 网站都是基于 IIS 转发的,所以我们需要关注 IIS 的文件上传限制以及 requestT ...

  3. Java实现FTP批量大文件上传下载篇1

    本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比 ...

  4. java 分次读取大文件的三种方法

    1. java 读取大文件的困难 java 读取文件的一般操作是将文件数据全部读取到内存中,然后再对数据进行操作.例如 Path path = Paths.get("file path&qu ...

  5. 【收藏】Java多线程/并发编程大合集

    (一).[Java并发编程]并发编程大合集-兰亭风雨    [Java并发编程]实现多线程的两种方法    [Java并发编程]线程的中断    [Java并发编程]正确挂起.恢复.终止线程    [ ...

  6. java处理excel-xlsx格式大文件的解决方案

    1.第一次读取7M左右的ecxel文件,使用poi 库实现,参考了下面的博文. http://www.cnblogs.com/chenfool/p/3632642.html 使用上面的方法在 下面Wo ...

  7. Windows 2003 复制大文件提示系统资源不足的处理方法

    方案一: 修改虚拟内存,让虚拟内存的大小略微超过要复制的文件的大小. 方案二: 修改注册表,如下: 注册表设置1 单击开始,单击运行,在打开框中键入“REGEDIT“ ,然后单击“确定”. 找到并单击 ...

  8. java ftp retrieveFile 较大文件丢失内容

    今天发现用  如下方法下载一个2.2M的zip文件但是只下载了500K没有下载完全,但是方法  返回的却是true boolean org.apache.commons.net.ftp.FTPClie ...

  9. java使用WebUploader做大文件的分块和断点续传

    版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...

随机推荐

  1. Unity3D的主要类图

    原文:http://blog.teotigraphix.com/2011/05/17/unity3d-uml-gameobject-cheat-sheet/ 1. GameObject_Structu ...

  2. MySQL中in子查询会导致无法使用索引问题(转)

    MySQL的测试环境 测试表如下 create table test_table2 ( id int auto_increment primary key, pay_id int, pay_time ...

  3. 【spring data jpa】【mybatis】通过反射实现 更新/保存 实体的任意字段的操作

    代码如下: //代码示例:例如保存时,传入下面两个字段 String filed;String content; //User代表要更新的实体,user即本对象 //filed代表要更改的字段,例如u ...

  4. 【SVN】删除SVN上的历史资源路径和SVN上的历史用户信息

    1.删除svn上历史资源路径 window--show view--other--svn资源库 可以右键选择删除 . ----------------------------------------- ...

  5. HDOJ 3359 Kind of a Blur

    用高斯消元对高斯模糊的图像还原.... Kind of a Blur Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/327 ...

  6. CKEditor+SWFUpload实现功能较为强大的编辑器(二)---SWFUpload配置

    在前面配置完CKEditor之后,就可以拥有一个功能挺强大的编辑器了 但是现在还不够,还要能够在发表文字中插入自己电脑上的图片 CKEditor自己好像有这个功能,但是实在是...没法说,很难用(这是 ...

  7. Android之TextView的Span样式源代码剖析

    Android中的TextView是个显示文字的的UI类.在现实中的需求中,文字有各式各样的样式,TextView本身没有属性去设置实现.我们能够通过Android提供的 SpannableStrin ...

  8. Python<1>List

    list里的元素以逗号隔开,以[]包围,当中元素的类型随意 官方一点的说:list列表是一个随意类型的对象的位置相关的有序集合. 它没有固定的大小(1).通过对偏移量 (2)进行赋值以及其它各种列表的 ...

  9. 改进xutils下载管理器,使其,在随意地方进行进度更新,以及其它状态监听操作

    1.前面在做下载进度监听.尝试过,通过加入 弱引用的View进度条,到相应的集合. 等到要进行更新进度的时候.通过Key 获取相应的VIew来进行更新 进度条.效果是达到了,可是我们怎样来监听其它的状 ...

  10. 渗透测试中的文件传输通道1- cmd下下载文件

    Set xPost = createObject("Microsoft.XMLHTTP")xPost.Open "GET","http://www.x ...