【发布时间】:2014-10-15 11:13:06
【问题描述】:
所以我正在尝试优化我正在使用的一些代码。该代码是为网站生成器编写的有点通用的搜索实用程序。
目前,搜索通过给定的基本目录递归搜索字符串,并返回具有该名称的任何目录的最后一个实例,或它找到的任何非目录的第一个实例。
例如:
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);
}
}
}
任何有关使我的代码更优化或我没有想到的问题的支持或信息都会很棒。
【问题讨论】:
-
你试过在Java中使用
FileVisitor接口吗?您不必为此重新发明轮子。 docs.oracle.com/javase/tutorial/essential/io/walk.html -
您尝试过
find实用程序吗?它已被彻底调整。find . -type d -name foo应该产生所有名为foo的目录。 -
@MikeSamuel-但是,为什么他需要
find的 unix/linux 实用程序在 java 中。我认为不存在任何联系。你是在建议他参考find命令的代码吗? -
@shekharsuman,不。我是说使用经过测试和优化的实用程序比编写、优化和调试 Java 程序更容易解决他的特定问题。
-
@MikeSamuel-实际上他已经提到他正在做这一切作为项目的一部分!我读错了吗?可能没有!无论如何,不要感觉它,这只是一个戳......