场景描述:某文件夹下有很多文件和文件夹,要求读取出该文件夹下的所有文件,并将文本打印输出。
案例分析:假设该文件夹下有10个文件,那么我们将所有的文件遍历一遍打印输出就可以了。但如果有100个, 1000个,10000个,甚至更多呢?这时候或许我们应该考虑使用多线程来解决这个问题喽,分批次读取文件。
Java实现思路:
(1)List readFiles(String filePath)
(2)subFiles(List fileList, int startIndex, int endIndex)
(3)readFile(File file)
(4)FavThreadUtil(List fileList).run()
干货代码:
(一)FavFileUtil.java,上面步骤(1)(2)(3)读取操作文件用
package com.linuxidc.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 getFileList(String filePath){
? ? ? ? List fileList = new ArrayList();
? ? ? ? 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 subFiles(List 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.linuxidc.favthread.util;
?
import java.io.File;
import java.io.IOException;
import java.util.List;
?
public class FavThreadUtil implements Runnable {
? ? ?
? ? private List fileList;
? ? ?
? ? public FavThreadUtil(List 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.linuxidc.favthread.main;
?
import java.io.File;
import java.util.List;
?
import com.linuxidc.favthread.util.FavFileUtil;
import com.linuxidc.favthread.util.FavThreadUtil;
?
public class Main {
?
? ? public static void main(String[] args) {
? ? ? ? List fileList = FavFileUtil.getFileList("D:\\log");
? ? ? ? List aList = fileList.subList(0, 10);
? ? ? ? List 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();
? ? }
?
}