我需要基于包含3100多个文件和14个文件夹的目录中的文件名列表搜索文件,但是完成搜索需要花费数小时。此外,我只谈论1个文件名列表,我还有其他要搜索的文件名列表。
找到要搜索的文件后,我需要访问它并在其中搜索单词。最后进入下一个文件。
我目前正在做的是我使用了“广度优先搜索”的概念,但是完成搜索也要花费数小时。
还有其他方法可以更快地完成此任务吗?
答案 0 :(得分:0)
查看代码中的注释
public class FileFinderApp {
// Create a list of file names that you want to process
private List<String> fileNames = new ArrayList<String>(Arrays.asList(new String[] {"test.txt","test1.txt","test2.txt"}));
// Create a FolderFilter, this just allows us to find files that are actually folders
private FolderFilter folderFilter = new FolderFilter();
public FileFinderApp() {
// Let the user know we are doing something in case there is no other output
System.out.println("Finding Files");
// Create a File to represent our starting folder
File startFolder = new File("F:\\FileTest");
// Get the list of Files that match our criteria
List<File> foundFiles = findFiles(startFolder, new FileNameFilter());
// loop through our files and do something with them
for (File file : foundFiles) {
// do something with each file
System.out.println(file.toString());
}
// Let the user know we are done.
System.out.println("Done Finding Files");
}
// This filter returns true if the File is a file (not folder, etc.) and matches one of our file names.
class FileNameFilter implements FileFilter {
public boolean accept(File file) {
return fileNames.contains(file.getName()) && file.isFile();
}
}
// This filter only returns folders
class FolderFilter implements FileFilter {
public boolean accept(File file) {
return file.isDirectory();
}
}
// Here's the meat and potatoes
private List<File> findFiles(File folder, FileFilter filter) {
// Create an empty list of Files
List<File> foundFiles = new ArrayList<File>();
// Find all sub-folders
File[] folders = folder.listFiles(folderFilter);
// Find the folders that pass our filter
File[] files = folder.listFiles(filter);
// add the files to our found files
foundFiles.addAll(Arrays.asList(files));
// for (File file : files) {
// System.out.println(file.getAbsolutePath());
// }
// loop through our sub-folders and get any files that match our filter there and add them to our list
// This is recursive and will execute as many levels as there are nested folders
for(File subFolder : folders) {
foundFiles.addAll(findFiles(subFolder, filter));
}
return foundFiles;
}
public static void main(String[] args) {
// don't block the UI
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new FileFinderApp();
}
});
}
}
答案 1 :(得分:0)
查看评论:
/**
* @param searchIn
* a valid path to any non null file or directory
* @param searchFor
* any non null name of a file or directory
*/
public static File findFile(String searchIn, String searchFor){
return findFile(new File(searchIn), searchFor);
}
/**
* @param searchIn
* not null file or directory
* @param searchFor
* any non null name of a file or directory
*/
public static File findFile(File searchIn, String searchFor){
if(searchIn.getName().equalsIgnoreCase(searchFor)) {
return searchIn;
}
if(searchIn.isDirectory() && (searchIn.listFiles() != null)){
for (File file : searchIn.listFiles() ){
File f = findFile(file, searchFor);
if(f != null) {
return f;
}
}
}
return null;
}
经过以下测试:
String sourcePath = "C:\\";
String searchFor = "Google Docs.ico";
File f = findFile(sourcePath, searchFor);
测得的性能:
时间:13.596946秒,目录:17985文件:116837