實例:線程池統計文件夾內txt文件字符長度,並輸出最長文件內容
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FilenameFilter;
import java.io.RandomAccessFile;
import java.io.Reader;
import java.util.concurrent.*;
public class Test2 {
private static String[] fileName; //存放文件名
private static int[] a=new int[100]; //存放文件長度
private static int length=0;
public void list(){
File dirFile = new File("d:/.");
FileAccept fileAccept = new FileAccept(); //調用自定義的類獲取目錄
fileAccept.setExtendName("txt");
fileName= dirFile.list(fileAccept); //獲取文件名存放在數組
length=fileName.length;
System.out.println("總共有 "+length+" 個文件");
}
public static void main(String[] args) {
Test2 t=new Test2();
t.list(); //調用list方法獲取文件目錄
ExecutorService pool= Executors.newFixedThreadPool(length); //設置線程池的最大線程數
for(int i=0;i<length;i++) {
Future<Integer> future=pool.submit(new Readlength(fileName[i])); //分配任務
try {
a[i]=future.get(); //接收文件長度存入數組
}catch (Exception e) {
e.printStackTrace();
}
}
pool.shutdown();
while(true){ //執行無線循環直到所有子線程都結束任務
if(pool.isTerminated()){
break;
}
}
int xuhao=0;
int max=0;
for(int i=0;i<fileName.length;i++){ //比較大小
if(max<a[i]){
max=a[i];
xuhao=i;
}
}
for(int i=0;i<length;i++){
System.out.println(fileName[i]+" 的長度爲 "+a[i]);
}
File file1=new File("D:/"+fileName[xuhao]); //獲取文件對象
System.out.println(file1.getName()+" 長度最長,內容如下: ");
try{
Reader fileReader = new FileReader(file1); //調用閱讀器,緩衝流讀取目標文件,並輸出顯示
BufferedReader in = new BufferedReader(fileReader);
String s=null;
while((s=in.readLine())!=null) {
System.out.println(s);
}
in.close();
fileReader.close();
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Readlength implements Callable<Integer>{
private String filename;
private int length=0;
public Readlength(String filename){
this.filename=filename;
}
@Override
public Integer call(){
// TODO Auto-generated method stub
try{
File file=new File("D:/"+filename);
RandomAccessFile in=new RandomAccessFile(file,"rw"); //調用隨機訪問文件的函數
length=(int) in.length(); //獲取文件的長度
}catch(Exception e){}
return length;
}
}
class FileAccept implements FilenameFilter {
private String extendName;
public void setExtendName(String s) {
extendName="."+s;
}
public boolean accept(File dir,String name) { //重寫接口中的方法
return name.endsWith(extendName);
}
}
修改其中的fileAccept.setExtendName("txt"),可以統計各種文件類型長度,自由發揮
作者: yuxiang