歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

基於Java多線程操作文件案例分享

場景描述:某文件夾下有很多文件和文件夾,要求讀取出該文件夾下的所有文件,並將文本打印輸出。

案例分析:假設該文件夾下有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();
    }
 
}

Copyright © Linux教程網 All Rights Reserved