java多线程实现复制大文件
有些开发的时候我们经常遇到这样一个问题,对大文件的处理。比如:日志文件。那么十几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:
- 创建一个可重用固定线程数的线程池
- ExecutorService pool = Executors.newFixedThreadPool(5);
- 然后将线程放入池中进行执行
- 关闭线程池 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();
void execute(Runnable command);
newFixedThreadPool()
创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程
java多线程实现复制大文件的更多相关文章
- C# FileStream复制大文件
即每次复制文件的一小段,以节省总内存开销.当然,本机复制也可以采用.NET内部的System.IO.File.Copy方法. 本文转载:http://www.cnblogs.com/wolf-sun/ ...
- 【Web应用】JAVA网络上传大文件报500错误
问题描述 当通过 JAVA 网站上传大文件,会报 500 错误. 问题分析 因为 Azure 的 Java 网站都是基于 IIS 转发的,所以我们需要关注 IIS 的文件上传限制以及 requestT ...
- Java实现FTP批量大文件上传下载篇1
本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比 ...
- java 分次读取大文件的三种方法
1. java 读取大文件的困难 java 读取文件的一般操作是将文件数据全部读取到内存中,然后再对数据进行操作.例如 Path path = Paths.get("file path&qu ...
- 【收藏】Java多线程/并发编程大合集
(一).[Java并发编程]并发编程大合集-兰亭风雨 [Java并发编程]实现多线程的两种方法 [Java并发编程]线程的中断 [Java并发编程]正确挂起.恢复.终止线程 [ ...
- java处理excel-xlsx格式大文件的解决方案
1.第一次读取7M左右的ecxel文件,使用poi 库实现,参考了下面的博文. http://www.cnblogs.com/chenfool/p/3632642.html 使用上面的方法在 下面Wo ...
- Windows 2003 复制大文件提示系统资源不足的处理方法
方案一: 修改虚拟内存,让虚拟内存的大小略微超过要复制的文件的大小. 方案二: 修改注册表,如下: 注册表设置1 单击开始,单击运行,在打开框中键入“REGEDIT“ ,然后单击“确定”. 找到并单击 ...
- java ftp retrieveFile 较大文件丢失内容
今天发现用 如下方法下载一个2.2M的zip文件但是只下载了500K没有下载完全,但是方法 返回的却是true boolean org.apache.commons.net.ftp.FTPClie ...
- java使用WebUploader做大文件的分块和断点续传
版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/in ...
随机推荐
- Delphi ParamStr 使用方法
ParamStr(0) 代表程序的路径, ParamStr(1) 代表程序的设置的参数
- 三种Web前端框架比较与介绍--Vue, react, angular
一.Angular 1.MVVM(Model)(View)(View-model): 2.模块化(Module)控制器(Contoller)依赖注入: 3.双向数据绑定:界面的操作能实时反映到数据,数 ...
- 图文介绍openLDAP在windows上的安装配置
目录 概述 测试环境 安装过程 配置启动 客户端介绍 多级DC的ldif文件的配置 [一].概述 什么叫LDAP呢,概念的东西这里就不多讲了,网上搜索下有很多,本文的重点是介绍如何在windows平台 ...
- python getopt学习记录
有时候我们需要写一些脚本处理一些任务,这时候往往需要提供一些命令行参数,根据不同参数进行不同的处理,在Python里,命令行的参数和C语言很类似(因为标准Python是用C语言实现的).在C语言里,m ...
- ElasticSearch中设置排序Java
有用的链接:http://stackoverflow.com/questions/12215380/sorting-on-several-fields-in-elasticsearch 有的时候,需要 ...
- 求出数组中所有数字的和&&弹出层效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- VB,Visual Basic如何修改代码文本大小和字体
工具-选项-编辑器格式 修改之后效果如图所示
- FolderBrowserDialog 关于设置为单线程单元(STA)模式的问题
当Main函数是这样的状态的时候,当打开FolderBrowserDialog控件的时候 ,报错 这里有两种解决办法,第一种,就是把main 上加[STAThread] 第二种是启用一个线程 Thre ...
- 动态添加Fragment
在Fragment简单用法的基础上做修改 一.新建:another_right_fragment.xml <LinearLayout xmlns:android="http://sch ...
- 渐进式 JPEG (Progressive JPEG)来提升用户体验
1.概述 jpg格式分为:Baseline JPEG(标准型)和Progressive JPEG(渐进式).两种格式有相同尺寸以及图像数据,扩展名也是相同的,唯一的区别是二者显示的方式不同. Base ...