基于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中的 ...
一周排行
  • =================================== 通知 =================================== 一.通知(NSNotification)    // NSNoti ...
  • 使用libvirt管理kvmvirsh篇
      一.简介libvirt是Linux上的虚拟化库,是长期稳定的C语言API,支持KVM/ ...
  • 自从来深圳后,我就开始从事IT行业.那时候没有工作经验,只能在小型企业工作,所以没有人指导,只能自己摸爬滚打.在经过深思熟虑之后,我决定成为一名网络工程师,因为有思科公司提供的系列培训来指导我.思科公司说过一句很出名 ...
  • 大型网站系统架构系列:分布式消息队列一
    一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量 ...
  • C++:继承
    1.继承:通过继承定义一个类,它们的类型之间的关系建模,共享共有的东西,实现各自本质不同的 ...
  • Debian 6.0.4下搭建的ftp环境,之前装好tftp后即使登录本地localhost上传下载文件也会一直超时,按网上的方法折腾了一下午,尝试了gftp等其他工具,未果.重新安装1.安装sudo apt-get ...
  • "天下武功唯快不破,无坚不摧" 这是功夫里的一句话.也应证了现在不断涌现的开放平台和应用平台,以及 ruby on rails.django等快速开发框架流行的现状. 国内的应用平台基本都号称建模 ...
  • WindowsServer2008R2集群OpenServiceRemoteRegistry失败笔记
    OpenService “RemoteRegistry” 失败. 我在创建验证域控服务器[ ...
  • EventComboMT是一个可以搜索多台不同计算机日志中的账户锁定事件的实用工具,所有的搜索任务都是在一个中心计算机上完成.要下载这个工具,请链接:[url]http://www.microsoft.com/dow ...
  • iOS开发网络篇—网络编程基础
    iOS开发网络篇—网络编程基础 一.为什么要学习网络编程 1.简单说明 在移动互联网时代, ...