场景描述:某文件夹下有很多文件和文件夹,要求读取出该文件夹下的所有文件,并将文本打印输出。
案例分析:假设该文件夹下有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程序运行测试。