基于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面向对象的封装特性,体现的人文的分而治之的思想。


本文出自 “这个人的IT世界” 博客,请务必保留此出处http://favccxx.blog.51cto.com/2890523/1623396

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。