如何使用Java读取目录下所有文本文件的内容?

How to read the content of all of the text files of a directory using Java?

提问人:Sneh Raghav 提问时间:9/23/2020 更新时间:9/23/2020 访问量:131

问:

我的问题是我想使用 Java 迭代目录中的所有文本文件,但每当我开始循环文件时,它总是会导致一半的处理,例如:- 我有 80 个文件,我想读取每个文件的内容,然后我开始循环,它只执行文件的最后一半。 这是我的代码 -Note: I have tried FileInputStream, Scanner class, BufferedReader as well. In FileInputStream, it gives EOFException and half-iteration results for other two methods.

    package InputFiles;

    import java.io.*;
    import java.util.Scanner;

    public class FileInput {
    public static void main(String[] args)  {
    File folder=new File("C:\\Users\\erpra\\Downloads\\SomePath");
    File[] listOfFiles=folder.listFiles();
    BufferedReader br=null;
    try {
        for(File tempFile:listOfFiles){
            System.out.println(tempFile.getName());
            br=new BufferedReader(new FileReader(tempFile));
            String str;
            while ((str=br.readLine())!=null){
                System.out.println(str);
            }
        }

    }catch (IOException e){
        e.printStackTrace();
    }finally {
        try {
            br.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
   }
    }
java 文件-io java.util.scanner bufferedreader 文件输入流

评论


答:

0赞 Conffusion 9/23/2020 #1

您的代码似乎对我有用,但我建议以不同的方式管理 FileReader 和 BufferedReader:

public static void main(String[] args) {
    File folder=new File("C:\\Users\\erpra\\Downloads\\SomePath");
    File[] listOfFiles=folder.listFiles();
    try {
        for (File tempFile : listOfFiles) {
            System.out.println(tempFile.getName());
            try (FileReader fr = new FileReader(tempFile); 
                 BufferedReader br = new BufferedReader(fr);) 
            {
                String str;
                while ((str = br.readLine()) != null) {
                    System.out.println(str);
                }
            }
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
}

通过使用 try-with-resources,每个 FileReader 和 BufferedReader 都将在 try 块的末尾正确关闭。您只关闭最后一个读取器。

但正如你所看到的,我没有改变while循环,因为它应该以这种方式工作正常。

评论

0赞 Sneh Raghav 9/23/2020
感谢您提供此解决方案,但我再次遇到同样的问题。我不知道为什么它执行最后一个文件并忽略有关前 40 个文件的文件。
0赞 Conffusion 9/23/2020
你如何验证,也许你的输出缓冲区(屏幕控制台)没有显示eveything。如果您只打印文件名,而不是其内容,该怎么办?它打印所有文件吗?
0赞 Sneh Raghav 9/24/2020
我的控制台通过跳过前 40 个文件来显示一半的内容,然后执行后面的文件。是的,它也会打印文件名,但为了检索所有文本文件的内部内容,它失败了。这是由于 BufferReader 容量不足造成的吗?我可以向你展示输出显示,但它有点保密。
0赞 Conffusion 9/24/2020
通常,文件的大小对于*Reader来说并不重要,因为它的工作方式更像是浏览内容的光标。不需要查看文件的内容,但您能给出它们的大小和您拥有的文件数量吗?单行的最大大小是多少?例如,XML 格式可能只有一行。但是,如果这将是一个问题,我会期望出现 OutOfMemory 错误。我希望内容是文字。
0赞 Sneh Raghav 9/24/2020
是的,内容是文本格式。而且,现在我想做的事情终于完成了。我对这些文件数据应用了“写入”,并将其存储在一个单独的文本文件中,并成功写入了内容。但是,它仍然没有在控制台中显示所有数据,但现在没有必要在控制台中显示数据,因为我现在有一个单独的文件。所以,谢谢你的帮助!