基于Java多线程操作文件案例分享

    场景描述:某文件夹下有很多文件和文件夹,要求读取出该文件夹下的所有文件,并将文本打印输出。

    案例分析:假设该文件夹下有10个文件,那么我们将所有的文件遍历一遍打印输出就可以了。但如果有100个, 1000个,10000个,甚至更多呢?这时候或许我们应该考虑使用多线程来解决这个问题喽,分批次读取文件。

    实现思路:

            (1)List<File> readFiles(String filePath)

            (2)subFiles(List<File> fileList, int startIndex, int endIndex)

            (3)readFile(File file)

            (4)FavThreadUtil(List<File> fileList).run()

    干货代码:

            (一)FavFileUtil.java,上面步骤(1)(2)(3)读取操作文件用

package com.favccxx.favthread.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class FavFileUtil {
	
	public static List<File> getFileList(String filePath){
		List<File> fileList = new ArrayList<File>();
		File file = new File(filePath);
		if(!file.isDirectory()){
			System.out.println("文件【" + file.getName() + "】:" + file.getAbsolutePath());
			fileList.add(file);
		}else{
			System.out.println("文件夹【" + file.getName() + "】:" + file.getAbsolutePath());
			File[] files = file.listFiles();
			for(int i = 0; i < files.length; i++){
                 if (!files[i].isDirectory()) {
                	 System.out.println("  文件【" + files[i].getName() + "】:");
                	 fileList.add(files[i]);
                 } else if (files[i].isDirectory()) {
                	 getFileList(files[i].getAbsolutePath());
                 }
			}
			
		}
		return fileList;
	}
	
	
	public static List<File> subFiles(List<File> list, int startIndex, int endIndex){
		if(endIndex>list.size()){
			return list.subList(startIndex, list.size());
		}
		return list.subList(startIndex, endIndex);
	}
	
	
	public static void readFile(File file) throws IOException{		
		//读取文件
		FileInputStream is = new FileInputStream(file);
		//获取文件的字符流
		InputStreamReader isr = new InputStreamReader(is);
		//缓冲
		BufferedReader br = new BufferedReader(isr);
		String line = null;
		while((line = br.readLine())!=null ){
            System.out.println(":::" + line);
        }
		br.close();
	}

}

            (二)FavThreadUtil.java,上面步骤(4)操作文件列表用

package com.favccxx.favthread.util;

import java.io.File;
import java.io.IOException;
import java.util.List;

public class FavThreadUtil implements Runnable {
	
	private List<File> fileList;
	
	public FavThreadUtil(List<File> fileList) {
		this.fileList = fileList;
	}

	@Override
	public void run() {
		for(File file : fileList){
			try {
				FavFileUtil.readFile(file);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

            (三)Main.java,Java Main程序运行测试。 

package com.favccxx.favthread.main;

import java.io.File;
import java.util.List;

import com.favccxx.favthread.util.FavFileUtil;
import com.favccxx.favthread.util.FavThreadUtil;

public class Main {

	public static void main(String[] args) {
		List<File> fileList = FavFileUtil.getFileList("D:\\log");
		List<File> aList = fileList.subList(0, 10);
		List<File> bList = fileList.subList(10, 20);
		FavThreadUtil afavThreatUtil = new FavThreadUtil(aList);
		FavThreadUtil bfavThreatUtil = new FavThreadUtil(bList);
		new Thread(afavThreatUtil, "线程1").start();
		new Thread(bfavThreatUtil, "线程2").start();
	}

}

    Java多线程体现的是Java面向对象的封装特性,体现的人文的分而治之的思想。

更多相关文章
  • JAVA多线程读写文件范例
       在写之前先声明,本文是基于之前在博客园网站上检索到的一份JAVA多线程读写文件的示例,我在写自己的程序时是在那位作者写的基础上做了改良,但已不记得原文的地址.如果有知情者,烦请帖出地址,我在此文上加入引用或转载.     本程序是基于这么一种考虑,某系统后台有个将近2G大小的日志文件,你用任何 ...
  • Java多线程操作相关问题总结
    Java多线程操作在运行的时候会有不少的问题困扰着我们.我们需要不断的学习以便于解决这些难题.下面我们就看看如何才能掌握相关的语法知识解决这些问题. Java多线程操作谈到阻塞,就不能不谈一谈死锁,略一分析就能发现,suspend() 方法和不指定超时期限的 wait() 方法的调用都可能产生死锁. ...
  • 我们知道XML文件既可以用来进行数据的传输,也可以配合DTD约束文件用来作为配置文件,当然其本质就是一个加了标签以及众多空格保持格式的字符串,那么就可以用Java进行操作. 本例是使用MyEclipse带入DOM4j解析时要用的jar包的基础上做的:当然DOM4j相对于DOM SAX 等解析方式的方 ...
  • java多线程操作
    进程是程序的一次动态的执行过程,它经历了从代码加载.执行完毕的一个完整过程,这个过程也是进程本身从产生.发展到最终消亡的过程.多线程是实现并发机制的一种有效的手段.进程和线程一样,都是实现并发的一个基本单位.如果现在同时运行多个任务,则所有的系统资源将是共享的,补所有线程所公用,但是程序处理需要CP ...
  • 前言:这篇文章来源于我写的一个小软件:多线程批量探测指定IP段的每个IP的服务器类型(Apache,tomcat,IIS...)并将探测结果写入到一个文件中.那么问题来了:如何保证在IP的循环递增过程中使用多线程而每个IP不被重复使用提交(PS:当然为了避免重复,可以用线程等待,唤醒,不过我个人觉得 ...
  • 基于JAVA语言的多线程技术
    1.简介 多线程技术属于操作系统范围内的知识: 进程与线程 可以这么理解,一个应用程序就是一个进程,在一个进程中包含至少一个线程:进程就是线程的容器,真正工作.处理任务的是线程. 进程是操作系统分配资源的基本单位:线程是操作系统进行调度,时间分配的基本单位: 进程由内核对象和地址空间两部分构成,内核 ...
  • /****************************************************************** *   最经闲暇之余,顺便总结了一点小东西,欢迎各位指点,主要操作文件的拷贝* * 前几天朋友问我,关于文件操作的问题,我当时觉得请简单的,最后才发现里  *   ...
  • 下班了,不想回去,小结一下...传说很久以前的Java是不支持对文本文件的处理的,后来为了弥补这个遗憾而新引入了Reader和Writer两个抽象类.最常用的就是Writer中的write(char[] ch,int off,int length)/flush()/close()以及Reader中的 ...
一周排行
  • 一.食物多样,粗为主 不同的食物提供的营养素不同,没有一种天然的食物能提供人体所需要的所有营养素.每天吃食物的种类要多一些,这样各种食物所提供的营养成分才能相互补充,满足生活和工作对营养的需求.经常吃点粗杂粮,如玉米 ...
  •  回忆一下自己的第一份工作,那是5年前,苏州高新区的一个小公司,做微信营销,二次开发 周围环境:公司,无小区 内部环境:很小,一人一米的办公桌(无间隔),无阳光,较昏暗 面试流程:填写信息 -> 笔试 -> ...
  • 在XP系统下载的系统中的故障你最怕什么,有人是网络的问题,不过很多用户最害怕的还是硬盘坏道的问题,可以说硬盘坏道(特别是物理坏道)是硬盘的所有故障中最让人头痛的.它轻则使你的爱机频频死机,重则让你的所有数据化为乌有. ...
  • IBMX系列服务器IMM日志采集
    IBM X系列服务器IMM日志采集IBM服务器素来以稳定著称,但有时候难免也会出现一些故障 ...
  • SymantecBE2010里面的资源视图打不开解决办法
       有的朋友在配置BE备份作业的时候会发现资源视图无法显示,按F5重试也无效,经检查,B ...
  •  说明:灰色背景的为命令蓝色字体为配置文件内容配置文件  ###添加修改以下内容在文件最前面添加修改:defaultautoinstallprompt 1timeout 10在文件最后添加label autoinst ...
  •  TCP头格式 TCP头格式 =========== 源端口 (16位) 目的端口 (16位) 序号 (32位) 确认号 (32位) 数据偏移 (4位) 保留 (6位) 标志 (6位) 窗口 (16位) 校验和 (1 ...
  • 0321读盖茨是这样培养的有感初稿
    读<盖茨是这样培养的>有感(初稿)      如果你当不了“盖茨”,那么你可以 ...
  •    上周六,csdn举办了第二届软件技术大会,我很荣幸作为嘉宾参加了这次盛会.第一届技术大会中,印象最深的就是下午的cto论坛和创业论坛,今年增加了电梯演讲的环节,不过论坛还是同样精彩.     回来以后,感觉有好 ...
  • Android消息循环机制
        Android中除了UI线程(主线程),创建的工作线程默认是没有消息循环和消息队列 ...