【发布时间】:2018-02-14 15:55:39
【问题描述】:
我的目标是:我想读取特定文本的文件,并且我想在包含所有文件的其他目录/子目录中找到该文本。但目前程序执行速度非常慢。我多次运行该程序以检查性能。我目前在我的系统中使用 jdk1.6。任何人都可以改善执行时间或指导如何获得更好的性能?
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class ActionFinder {
private static final String FILENAME = "D:\\WorkSpace\\data\\Navigation.properties";
private static ArrayList<String> allAbsoluteFilePathList = new ArrayList<String>();
public static void main(String[] args) {
BufferedReader br = null;
FileReader fr = null;
try {
fr = new FileReader(FILENAME);
br = new BufferedReader(fr);
String sCurrentLine;
ArrayList<String> actionList = new ArrayList<String>();
while ((sCurrentLine = br.readLine()) != null) {
String cmdString = sCurrentLine;
if(cmdString.contains(".Commands")){
String[] output = cmdString.split("\\.Commands");
actionList.add("Action."+output[0]);
}
}
listAllTheFile("D:\\dev\\vob002\\IB\\war\\src\\main\\webapp\\web\\L001\\corporate");
//here we are finding all the actions one by one from the file list
for(int i=0; i < actionList.size(); i++){
String actionName= actionList.get(i);
searchAction(allAbsoluteFilePathList, actionName);
}
} catch (Exception e) {
System.out.println("Error2: " + e.toString());
} finally {
try {
if (br != null)
br.close();
if (fr != null)
fr.close();
} catch (Exception ex) {
System.out.println("Error3: " + ex.toString());
}
}
}
private static void searchAction(ArrayList<String> allAbsoluteFilePathList, String actionName) {
try {
if(null !=allAbsoluteFilePathList){
for(int i=0; i < allAbsoluteFilePathList.size(); i++){
final Scanner scanner = new Scanner(new File(allAbsoluteFilePathList.get(i)));
while (scanner.hasNextLine()) {
final String lineFromFile = scanner.nextLine();
if(lineFromFile.contains(actionName)) {
// a match!
System.out.println("I found " +actionName+ " in file " + allAbsoluteFilePathList.get(i));
break;
}
}
}
}
}catch (Exception e) {
System.out.println("Error1: " + e.toString());
}
}
private static List<File> listAllTheFile(String directoryName) {
File directory = new File(directoryName);
List<File> resultList = new ArrayList<File>();
File[] fList = directory.listFiles();
resultList.addAll(Arrays.asList(fList));
for (File file : fList) {
if (file.isFile()) {
allAbsoluteFilePathList.add(file.getAbsolutePath());
} else if (file.isDirectory()) {
resultList.addAll(listAllTheFile(file.getAbsolutePath()));
}
}
return resultList;
}
}
【问题讨论】:
-
你可以从更新你的 jdk 开始
-
使用分析来找出代码大部分时间花在哪里,并采取相应的行动。调用计数也会有所帮助,您可能在某个地方有一个 n 平方算法。
-
@Stultuske 根据他的情况,他可能无法控制他的环境。也不一定能提高性能。
标签: java multithreading performance file