递归:检查目录中的文件并阅读它们

时间:2014-11-02 00:39:27

标签: java file recursion directory

在你推测像“这家伙正在寻求家庭作业帮助”之类的事情之前,我会继续说清楚你可能有的任何疑问并说是,这与家庭作业有关。但是,我希望这不会影响这个问题为我和/或将来读这个问题的人提供的知识。

背景:我们正在进行递归,我们的任务要求我们编写一个程序,使用命令参数检查目录及其文件内容以查找字符串(这也是一个命令参数)。我们必须使用递归。


- 我想明确表示我了解分配的要求 我只是在问,这是如何递归的,因为我没有得到它。

我们遇到了一个问题,我们必须找到一个目录的大小,这是有意义的,但我不知道如何检查某些东西是一个目录或文件,并基于我们阅读其内容或深入了解直到找到文件为止的目录。


这是我目前所做的。不太确定这是多么错误,因为我完全基于我们以前做过的'检查目录大小'的分配:

我正在检查的文件夹是这样的: 目录---> files --inside主目录--->>两个目录---->这两个目录中的文件

public class SearchingForStrings {

public static void main(String[] args) {
    String path = "."; // default location of this project
    File sf = new File(path);
    String mysteriesDirectory = args[0];
    String keyString = args[1];

    countLinesWithString(sf, mysteriesDirectory, keyString);
}

public static int countLinesWithString(File startPath, String mysteriesDirectory, String keyString) {
    if(!startPath.exists()) {
        throw new IllegalArgumentException("File " + startPath + " does not exist!");
    } else if(startPath.isFile()) {
        return Integer.parseInt(startPath.getAbsolutePath()); // Just to show where the file is I located the parsing is just to stop an error from flagging on this part; Going to ask professor if it's okay with him


        // this is where we would begin reading the contents of the files
    } else if(startPath.isDirectory()) {
        // This is where our recursion would take place: essentially
        // we will be going 'deeper' into the directory until we find a file

        //File[] subFiles = startPath.listFiles();
        countLinesWithString(startPath, mysteriesDirectory, keyString);
    } else {
        throw new IllegalStateException("Unknown file type: " + startPath);
    }

}

}

简而言之:如果你想深入了解导演(y / ies),有人可以解释递归是如何起作用的吗?

2 个答案:

答案 0 :(得分:1)

我会试一试。这比理解更容易解释。

你已经取得了不错的开始的递归方法可能记录如下:

“对于给定目录:对于目录中的每个文件,计算包含给定字符串的所有行;对于目录中的每个目录,递归”。

递归是可能的 - 也是有用的 - 因为你的原始目标是一个容器,它可以包含的其中一种类型是另一个容器。

所以想想这样的计数方法:

int countLines(dir, string)  // the string could be an instance variable, also, and not passed in
{
  var countedLines = 0;
  for each item in dir:
    if item is file, countedLines += matchedLinesInFile(item, string);
    else if item is dir, countedLines += countLines(item, string);
    else throw up;  // or throw an exception -- your choice
}

然后从外部方法调用countLines,使用原始目录,加上字符串。

让人们了解递归的一个原因是,在你写完之后,它似乎不可能完成它所做的一切。但通过以上针对不同场景进行思考。如果传入的目录有文件而没有dirs,它将为dir中的每个文件累积countLines,并返回结果。这就是你想要的。

如果dir确实包含其他目录,那么对于其中每一个,你将调用例程并从包含dir开始。该调用将为该目录中的每个文件累积countLines,并在树中递归调用每个目录,直到它到达没有dirs的目录。而且它仍然会计算那些线条,它只是没有任何进一步下降。

在最低级别,它将累积这些线并返回它们。然后第二个最低级别将获得该总数添加到其总数,并开始返回行程返回递归树。

这能解释得更好吗?

答案 1 :(得分:1)

帮助您开始递归检查: 它将递归地从基本目录打印所有文件夹和文件。 根据您的要求进行修改。试着告诉我们。

import java.io.File;

public class Test {


    public static void getResource(final String resourcePath) {

        File file = new File(resourcePath);
        if (file.isFile()) {
            System.out.println("File Name : " + file.getName());
            return;
        } else {
            File[] listFiles = file.listFiles();
            if (listFiles != null) {
                for (File resourceInDirectory : listFiles) {

                    if (!resourceInDirectory.isFile()) {
                        System.out.println("Folder "
                                + resourceInDirectory.getAbsolutePath());
                        getResource(resourceInDirectory.getAbsolutePath());
                    } else {
                        getResource(resourceInDirectory.getAbsolutePath());
                    }

                }
            }

        }
    }

    public static void main(String[] args) {

        final String folderPath = "C:/Test";
        getResource(folderPath);
    }

}