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

