基于Java多线程操作文件案例分享

本文介绍了一种使用Java多线程技术批量读取指定目录下所有文件的方法。通过递归获取文件列表并利用多线程进行分批读取,有效提升了文件处理效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 场景描述:某文件夹下有很多文件和文件夹,要求读取出该文件夹下的所有文件,并将文本打印输出。


    案例分析:假设该文件夹下有10个文件,那么我们将所有的文件遍历一遍打印输出就可以了。但如果有100个, 1000个,10000个,甚至更多呢?这时候或许我们应该考虑使用多线程来解决这个问题喽,分批次读取文件。


    实现思路:


            (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)读取操作文件用


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.favccxx.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)操作文件列表用


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.favccxx.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程序运行测试。 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.favccxx.favthread.main;
 
import java.io.File;
import java.util.List;
 
import com.favccxx.favthread.util.FavFileUtil;
import com.favccxx.favthread.util.FavThreadUtil;
 
public class Main {
 
    public static void main(String[] args) {
        List<File> fileList = FavFileUtil.getFileList("D:\\log");
        List<File> aList = fileList.subList(010);
        List<File> bList = fileList.subList(1020);
        FavThreadUtil afavThreatUtil = new FavThreadUtil(aList);
        FavThreadUtil bfavThreatUtil = new FavThreadUtil(bList);
        new Thread(afavThreatUtil, "线程1").start();
        new Thread(bfavThreatUtil, "线程2").start();
    }
 
}


    Java多线程体现的是Java面向对象的封装特性,体现的人文的分而治之的思想。





本文转自 genuinecx 51CTO博客,原文链接:http://blog.51cto.com/favccxx/1623396,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值