【问题标题】:Reading multiple files in directory and printing specific content读取目录中的多个文件并打印特定内容
【发布时间】:2016-11-20 22:34:42
【问题描述】:

我想要实现的基本上是一个 Java 文件,它查看用户计算机上的特定目录,在目录中的所有文件中搜索特定单词(在本例中为电子邮件),然后最后将它们打印出来.

我现在拥有的当前脚本在某个目录中查找所有文件,并打印出这些文件名。除此之外,我还想出了如何让该脚本在一个文件中搜索特定单词,然后将其打印出来。唯一的问题是,尽管它搜索了那个文件并获得了那个词/短语,但它必须得到完整的目录和文件才能工作。我只希望它有一个特定的目录,然后搜索其中的所有文件。我尝试使用我创建的目录变量来查找所有文件,但是当使用它作为文件的目录来搜索以查找单词时,它不起作用。

下面是我的代码部分,用于我想要的功能。实际函数是在我的真实脚本中调用的,所以不要担心它正在工作。我也刚刚在脚本中注释了我想在哪里工作的变量。

    package aProject;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class aScanner {

    static String usernameMac = System.getProperty("user.name");
    final static File foldersMac = new File("/Users/" + usernameMac + "/Library/Mail/V2"); // this is the right directory I want to look through

    public static void listFilesForFolder(final File foldersMac) {
        for (final File fileEntry : foldersMac.listFiles()) {

            if (fileEntry.isDirectory()) {
                listFilesForFolder(fileEntry);

                try {
                    BufferedReader bReaderM = new BufferedReader(new FileReader("/Users/username/Library/Mail/V2/AosIMAP-/INBOX.mbox/longnumber-folder/Data/Messages/1.emlx")); //this is where I would like the foldersMac variable to work in, instead of this full directory
                    String lineMe;
                    while((lineMe = bReaderM.readLine()) != null)
                    {
                        if(lineMe.contains(".com"))
                            System.out.println(lineMe);
                    }
                    bReaderM.close();
                }
                catch (IOException e) {

                }

            } else {
                System.out.println(fileEntry.getName());

            }

        }
    }

    }

【问题讨论】:

  • 不要忘记关闭该阅读器,以防出现 az IOException 或任何其他行为。我宁愿把 .close() 方法放在 finally 块中。

标签: java file printing bufferedreader filereader


【解决方案1】:

我认为这是您想要实现的目标:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class aScanner {

    static String usernameMac = System.getProperty("user.name");
    final static File foldersMac = new File("/Users/" + usernameMac + "/Library/Mail/V2");

    public static void main(String[] args) throws IOException {
        listFilesForFolder(foldersMac);
    }

    public static void listFilesForFolder(final File foldersMac) throws IOException {
        for (final File fileEntry : foldersMac.listFiles()) {
            if (fileEntry.isDirectory()) {
                listFilesForFolder(fileEntry);
            } else {
                ArrayList<String> lines = new ArrayList<>();
                try (BufferedReader bReaderM = new BufferedReader(new FileReader(fileEntry))) {
                    String lineMe;
                    while ((lineMe = bReaderM.readLine()) != null) {
                        if (lineMe.contains(".com")) {
                            lines.add(lineMe);
                        }
                    }
                }
                if (!lines.isEmpty()) {
                    System.out.println(fileEntry.getAbsolutePath() + ":");
                    for (String line : lines) {
                        System.out.println("  " + line.trim());
                    }
                }
            }
        }
    }
}

【讨论】:

  • 感谢您抽出宝贵时间编写代码,我已尝试将其实现到我的代码中。但这给了我一堆错误,我知道我当然必须导入所有插件,我已经完成了。但它仍然给我带来了我无法修复的不同错误。如果您将代码放入compilejava.net,它也会给出一堆错误。这是我在 Eclipse cannot instantiate the type ArrayList&lt;?&gt; 中遇到的错误之一
  • 我编辑并添加了所需的导入。它不会在 compilejava.net 中运行,因为沙箱不允许访问系统属性或文件系统,但它可以编译。
【解决方案2】:

我认为你的问题在于你的递归逻辑, 你在目录结构中递归下去,你遍历你的树,但没有写出这个 if 语句的原因:

if (fileEntry.isDirectory()) {
                listFilesForFolder(fileEntry);

...
}

提前关闭 If 语句,那么它应该可以工作。

【讨论】:

  • 我已经按照你说的那样改变了它,我现在想,但唯一改变的是。是不是现在它只打印出它已经完成的文件的名称,而不是它的实际内容。
猜你喜欢
  • 2011-11-02
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多