无法突破(每个)循环java

时间:2015-04-24 06:29:33

标签: java for-loop file-io

我是新来的,你可以看到这是我的第一篇文章。我正在编写一个程序来读取文件的用户输入,然后继续搜索该文件的计算机(提供用户目录),然后打印出找到该文件的确切目录。

问题是,这个方法会找到目录,但随后无限运行,我似乎无法突破它。也许我错过了一些东西,但我认为我覆盖了每一个案例,所以当它找到完整的目录时,它会停止运行该方法。这是代码:

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”语句无限运行。 对不起,如果这是一个糟糕的帖子或太长,我是新的。感谢。

3 个答案:

答案 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"); 
       }    
    }); 
}