場景描述:某文件夾下有很多文件和文件夾,要求讀取出該文件夾下的所有文件,並將文本打印輸出。
案例分析:假設該文件夾下有10個文件,那麼我們將所有的文件遍歷一遍打印輸出就可以了。但如果有100個, 1000個,10000個,甚至更多呢?這時候或許我們應該考慮使用多線程來解決這個問題喽,分批次讀取文件。
Java實現思路:
(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.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<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.linuxidc.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.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<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();
}
}