我是新来的,你可以看到这是我的第一篇文章。我正在编写一个程序来读取文件的用户输入,然后继续搜索该文件的计算机(提供用户目录),然后打印出找到该文件的确切目录。
问题是,这个方法会找到目录,但随后无限运行,我似乎无法突破它。也许我错过了一些东西,但我认为我覆盖了每一个案例,所以当它找到完整的目录时,它会停止运行该方法。这是代码:
public void findFile(File d, String fileName, boolean found) {
File[] newArray = d.listFiles();
for (File z : newArray) {
if (fileName.equals(z.getName())) {
System.out.println("The location of the file is: " + z.getParentFile());
break;
}
else if(!found){
if(z.isDirectory() && z.getName().charAt(0) != '.') {
findFile(z, fileName, found);
}
}
}
}
这是调用方法的地方(案例3):
switch (answer) {
case 1:
directory(false);
break;
case 2:
directory(true);
break;
case 3:
System.out.println("Enter the file you would like to locate:");
String newFile = keyboard.nextLine();
findFile(new File("/Users/Josh"), newFile, false);
break;
case 4:
break;
case 5:
break;
case 6:
System.out.println("Program ended.");
condition = false;
break;
}
程序将在找到我正在查找的文件的目录后,通过“findFile”方法的“else if”语句无限运行。 对不起,如果这是一个糟糕的帖子或太长,我是新的。感谢。
答案 0 :(得分:1)
我会像这样重写
public boolean findFile(File d, String fileName) {
boolean found = false;
File[] newArray = d.listFiles();
for (File z : newArray) {
if (fileName.equals(z.getName())) {
System.out.println("The location of the file is: " + z.getParentFile());
found = true;
} else {
if (z.isDirectory() && z.getName().charAt(0) != '.') {
found = findFile(z, fileName);
}
}
if(found){
break;
}
}
return found;
}
答案 1 :(得分:0)
即使您找到该文件,您的递归也不会停止。参数found
在您的方法中没有多大用处。我会建议这样的事情(没有经过测试,但应该明确我的意思):
public boolean findFile(File d, String fileName) {
// check if file exists in current directory
if (new File(d, filename).exists() {
System.out.println("The location of the file is: " + d);
return true;
}
// if not, look in subdirectories
for (File f: d.listFiles()) {
if (f.isDirectory() && findFile(f, fileName)) {
// findFile returned true, so it was found
return true;
}
}
// not found
return false;
}
如果要查找具有名称的所有文件(不同子目录中可能有多个),可以将返回类型设置为void
并删除返回语句。
您也可以使用Files.walkFileTree。
答案 2 :(得分:0)
我更喜欢使用这样的方法,对方法签名和return语句进行一些修改,你会很快解决问题!
public File[] finder(String dirName){
File dir = new File(dirName);
return dir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String filename) {
return filename.endsWith(".txt");
}
});
}