java多线程批量读取文件(七)
新公司入职一个多月了,至今没有事情可以做,十来个新同事都一样抓狂,所以大家都自己学习一些新东西,我最近在看zookeeper,感觉蛮不错的,和微服务的zuul以及eureka功能类似,只是代码复杂了一些。而今天,我所要说的是java多线程读取文件的两个例子;
例子1:java多线程批量读取文件
package face.thread.ReadFile;
/**
* 多线程读、写文件
*
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CompareTest3 {
public static void main(String args[]) {
long millis1 = System.currentTimeMillis();
System.out.println(millis1);
Read3 read = new Read3(millis1);
ExecutorService service = Executors.newFixedThreadPool(5);
for(int i = 1; i <= 3; i++){
service.execute(new Thread(read, "线程" + i));
}
}
}
class Read3 implements Runnable {
Object o = new Object();
List<File> filePathsList = new ArrayList<File>();
int index = 0;
private long millis ;
public Read3(long millis1 ) {
this.millis = millis1;
File f = new File("d:" + File.separator + "gc2");
getFileList(f);
}
private void getFileList(File f) {
File[] filePaths = f.listFiles();
for (File s : filePaths) {
if (s.isDirectory()) {
getFileList(s);
} else {
if (-1 != s.getName().lastIndexOf(".txt")) {
filePathsList.add(s);
}
}
}
}
public void run() {
File file = null;
File f2 = null;
while (index < filePathsList.size()) {
//此处,保证了多线程不会交叉读取文件
//--1.1方法内的变量是线程安全的
//解释:由于方法内的变量是私有的,本体访问的同时别人访问不了,所以是线程安全的。
//--1.2实例变量是非线程安全的
//解释:由于实例变量可以由多个线程访问,当本体操作变量过程中,别人也可以抢占资源操作变量,使数据不同步了,所以是非线程安全的。
synchronized (o) {
if (index > filePathsList.size()) {
return;
}
file = filePathsList.get(index);
index++;
//System.out.println("内部index: " + index);
}
// System.out.println("文件: " + file.getName());
FileReader fr = null;
BufferedReader br = null;
StringBuffer sb = new StringBuffer();
FileWriter fw = null;
BufferedWriter bw = null;
f2 = new File("d:" + File.separator + "gc3" + File.separator + file.getName());
try {
fr = new FileReader(file);
br = new BufferedReader(fr);
fw = new FileWriter(f2);
bw = new BufferedWriter(fw);
String data = "";
while((data = br.readLine()) != null){
// sb.append(data + "\r");
bw.write(data + "\r");
}
bw.write("---------------" + Thread.currentThread().getName()+"---------------");
System.out.println(Thread.currentThread().getName() + " : " + file.getName());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
bw.close();
br.close();
/*long millis2 = System.currentTimeMillis();
System.out.println(millis2);
System.out.println(millis2 - millis); //大约1-2ms*/
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
例子2:同样的读取文件,改为单线程读取
package face.thread.ReadFile;
/**
* 单线程读、写文件
*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CompareTest4 {
public static void main(String args[]) {
final long millis1 = System.currentTimeMillis();
final CyclicBarrier cb = new CyclicBarrier(1,new Runnable(){
public void run() {
long millis2 = System.currentTimeMillis();
System.out.println(millis2);
System.out.println(millis2 - millis1); //大约1-2ms
}
});
Read4 read = new Read4(cb);
ExecutorService service = Executors.newFixedThreadPool(1);
for(int i = 1; i <= 1; i++){
service.execute(new Thread(read, "线程" + i));
}
}
}
class Read4 implements Runnable {
Object o = new Object();
List<File> filePathsList = new ArrayList<File>();
int index = 0;
CyclicBarrier cb2;
public Read4(CyclicBarrier cb) {
this.cb2 = cb;
File f = new File("d:" + File.separator + "gc2");
getFileList(f);
}
private void getFileList(File f) {
File[] filePaths = f.listFiles();
for (File s : filePaths) {
if (s.isDirectory()) {
getFileList(s);
} else {
if (-1 != s.getName().lastIndexOf(".txt")) {
filePathsList.add(s);
}
}
}
}
public void run() {
File file = null;
File f2 = null;
while (index < filePathsList.size()) {
synchronized (o) {
if (index > filePathsList.size()) {
return;
}
file = filePathsList.get(index);
index++;
//System.out.println("内部index: " + index);
}
// System.out.println("文件: " + file.getName());
FileReader fr = null;
BufferedReader br = null;
StringBuffer sb = new StringBuffer();
FileWriter fw = null;
BufferedWriter bw = null;
f2 = new File("d:" + File.separator + "gc3" + File.separator + file.getName());
try {
fr = new FileReader(file);
br = new BufferedReader(fr);
fw = new FileWriter(f2);
bw = new BufferedWriter(fw);
String data = "";
while((data = br.readLine()) != null){
// sb.append(data + "\r");
bw.write(data + "\r");
}
bw.write("---------------" + Thread.currentThread().getName()+"---------------");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
bw.close();
br.close();
try {
cb2.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
两个例子中,打印的时间即代表线程读取每个代码的时间,性能对比一看就能体现出来,只是个小Demo,望大神勿喷!
java多线程批量读取文件(七)的更多相关文章
- java多线程批量读取文件( 八)--读写分离
package com.net.thread.future; import java.io.BufferedReader; import java.io.BufferedWriter; import ...
- java多线程批量下载文件
多线程下载文件 平时开发中有时会用到文件下载,为了提高文件的下载速率,采用多线程下载能够达到事半功倍的效果: package test; /** * 文件下载类 * @author luweichen ...
- JAVA多线程下载网络文件
JAVA多线程下载网络文件,开启多个线程,同时下载网络文件. 源码如下:(点击下载 MultiThreadDownload.java) import java.io.InputStream; im ...
- R8—批量生成文件夹,批量读取文件夹名称+R文件管理系统操作函数
一. 批量生成文件夹,批量读取文件夹名称 今日,工作中遇到这样一个问题:boss给我们提供了200多家公司的ID代码(如6007.7920等),需要根据这些ID号去搜索下载新闻,从而将下载到的新闻存到 ...
- 使用Perl批量读取文件最后行
使用Perl批量读取文件最后行 面对成百上千个文件,有时我们需要查看它的最后行,单个文件打开将耗费大量时间,而通过Perl提取出最后行,将快速的帮助我们处理繁琐的事务. 特性 整个目录完全遍历,自动提 ...
- [JAVA 多种方式读取文件]
package com.file; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream ...
- Java相对路径读取文件
不管你是新手还是老鸟,在程序中读取资源文件总会遇到一些找不到文件的问题,这与Java底层的实现有关,不能算bug,只要方法得当,问题还是可以解决的. 项目的文件夹结构: repathtest ├─sr ...
- Java实现批量修改文件名称
import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; /** ...
- 【工具】JAVA 在单元读取文件并比较
package test20140709; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; ...
随机推荐
- 将Spring源码转换为工程 + 导入Eclipse时缺失jar包
将源码转换为工程: 比如查看Spring事务部分的源码. 打开cmd窗口,切换到Spring-tx文件夹下,执行命令 “gradle cleanidea eclipse” . 缺失jar包: 第一步: ...
- Springboot开源项目实例整理
https://www.imooc.com/article/67664 ---------------------------------------------------------------- ...
- Mac 下显示隐藏文件或文件夹
Mac 操作系统 隐藏显示文件 显示:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏:defaults write co ...
- 线程队列queue
队列queue 队列用于线程之间安全的信息交换 队列和列表的区别:队列里的信息get()后就没了,而列表获取数据则是copy,原列表里的值还在 使用前先实例化队列 q = queue.Queue(ma ...
- Struts2_HelloWorld_6
为 eclipse 在编写 xml配置文件时提供提示,需要加上dtd或xls的标签定义文件的路径,具体操作: 1.Window——Preferences——XML Catalog 2.添加 dtd 文 ...
- Docker build 安装报错, Could not open requirments file: [Errno 2] No such file or directory:'requirements.txt'
docker安装教程 https://docs.docker.com/get-started/part2/#build-the-app 相关帖子 https://stackoverflow.com/q ...
- SAP成都研究院飞机哥: SAP C4C中国本地化之微信聊天机器人的集成
今天的文章仍然来自Jerry的老同事,SAP成都研究院的张航(Zhang Harry).关于他的背景介绍,请参考张航之前的文章:SAP成都研究院飞机哥:程序猿和飞机的不解之缘.下面是他的正文. 大家好 ...
- NutDao配置多数据源
首先,我必须声明,这是一个非常简单的方法,很多小菜没做出来,是因为把nutz想得太复杂 数据源(或者是数据库连接池),在Nutz.Ioc看来,是一个普通的Bean,没任何特别之处. 再强调一点,除了$ ...
- 2019.03.13 ZJOI2019模拟赛 解题报告
得分: \(55+12+10=77\)(\(T1\)误认为有可二分性,\(T2\)不小心把\(n\)开了\(char\),\(T3\)直接\(puts("0")\)水\(10\)分 ...
- 在vue中使用插槽 slot
插槽(slot)这个概念非常重要 插槽的使用场景1:在子组件里面显示父组件的dom <div id='root'> <child content = '<p>Dell&l ...