Java 使用哈希搜索文件树是否更有效?
因此,我试图优化一些我正在使用的代码。该代码是为网站生成器编写的某种通用搜索实用程序 当前,搜索在给定的基本目录中递归搜索字符串,并返回具有该名称的任何目录的最后一个实例,或找到的任何非目录的第一个实例 例:Java 使用哈希搜索文件树是否更有效?,java,search,hashmap,Java,Search,Hashmap,因此,我试图优化一些我正在使用的代码。该代码是为网站生成器编写的某种通用搜索实用程序 当前,搜索在给定的基本目录中递归搜索字符串,并返回具有该名称的任何目录的最后一个实例,或找到的任何非目录的第一个实例 例: 任何关于使我的代码更优化的支持或信息,或者我没有想到的问题,都会非常好 我最终只是实现了它,速度快了大约400% 编辑: 一些改进总体代码的优化 注意:这段代码不是线程安全的,因为我使用的是静态方法和变量 您是否尝试过在Java中使用FileVisitor接口?你不必为此重新发明轮子。你试
任何关于使我的代码更优化的支持或信息,或者我没有想到的问题,都会非常好 我最终只是实现了它,速度快了大约400% 编辑: 一些改进总体代码的优化
注意:这段代码不是线程安全的,因为我使用的是静态方法和变量 您是否尝试过在Java中使用
FileVisitor
接口?你不必为此重新发明轮子。你试过这个工具吗?它已经被彻底调整过了<代码>查找-键入d-name foo应该会生成所有名为foo
@MikeSamuel的目录,但是,为什么他需要find
unix/linux的java实用程序呢。。我认为没有任何联系。你是在建议他参考find
命令的代码吗?@shekharsuman,不是。我是说,使用经过测试和优化的实用程序来解决他的特定问题比编写、优化和调试Java程序更容易。@MikeSamuel实际上他已经提到,他将所有这些都作为项目的一部分来做!我读错了吗?可能没有!不管怎样,别感觉到,那只是一个戳。。。
public static File findFile(File baseDir, String name) throws IOException{
File match = null;
for (File f : findFiles(baseDir, name)){
if (match == null ||
match.isDirectory() ||
matchesFile(name, f) > matchesFile(name, match)){
match = f;
}
}
return match;
}
public static Set<File> findFiles(File baseDir, String name) throws IOException{
Set<File> files = new HashSet<File>();
for (File f : baseDir.listFiles()){
if (!f.isDirectory()){
if (matchesFile(name, f) > 0){
files.add(f);
}
}else{
files.addAll(findFiles(f, name));
if (matchesFile(name, f) > 0){
files.add(f);
}
}
}
if (matchesFile(name, baseDir) > 0){
files.add(baseDir);
}
return files;
}
public static File findFile(File baseDir, String name) throws IOException{
File match = null;
if(!baseDirHash.containsKey(baseDir.getAbsolutePath())){
baseDirHash.put(baseDir.getAbsolutePath(), baseDir);
hashBaseDir(baseDir, baseDir);
}
match = baseDirHash.get(baseDir.getAbsoluteFile() + name);
if(match == null || !match.exists()){
for (File f : findFiles(baseDir, name)){
if (match == null ||
match.isDirectory() ||
matchesFile(name, f) > matchesFile(name, match)){
match = f;
}
}
}
if(!match.isDirectory()){
baseDirHash.put(baseDir.getAbsoluteFile() + name, match);
}
return match;
}
...
private static void hashBaseDir(File baseDir, File currentDir) throws IOException{
for (File f : currentDir.listFiles()){
if (!f.isDirectory()){
baseDirHash.put(baseDir.getAbsolutePath() + f.getName(), f);
}else{
hashBaseDir(baseDir, f);
}
}
}