歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 基於Java多線程操作文件案例分享

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

日期:2017/3/1 9:30:34   编辑:Linux編程

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

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