【问题标题】:Can't break out of for(each) loop java无法摆脱 for(each) 循环 java
【发布时间】:2015-04-24 06:29:33
【问题描述】:

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

问题是,这个方法会找到目录,然后无限运行,我似乎无法摆脱它。也许我遗漏了一些东西,但我认为我涵盖了所有情况,因此当它找到完整目录时,它会停止运行该方法。代码如下:

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

【问题讨论】:

  • 你的findFile 方法应该返回一个值,调用者可以决定它是否应该继续处理
  • 您没有在方法中设置found 变量。以及为什么要检查文件,如果您没有找到找到的输出??
  • 如果'boolean found'表示是否找到文件,那么你的命名约定不好!这里有一些关于如何使命名更有意义的建议。 'boolean found' --> 'boolean isFileFound' 'File[] newArray' --> 'File[] files' 'File z : newArray' --> 'File file : files'

标签: java for-loop file-io


【解决方案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;
}

【讨论】:

    【解决方案2】:

    即使你找到了文件,你的递归也不会停止。参数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

    【讨论】:

      【解决方案3】:

      我更喜欢使用这样的方法,对方法签名和返回语句进行一些修改,您将很快解决您的问题!

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

      【讨论】:

        猜你喜欢
        • 2018-01-14
        • 1970-01-01
        • 2013-06-20
        • 1970-01-01
        • 1970-01-01
        • 2020-08-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多