【问题标题】:How to loop through a directory, get all file names, then get the contents of those files in Java如何遍历目录,获取所有文件名,然后在 Java 中获取这些文件的内容
【发布时间】:2015-09-29 13:27:19
【问题描述】:

所以在 C 盘中,我有一个名为 Search Files 的文件夹,在 Search Files 内部,我有四个子目录,分别名为 Folder 1Folder 2Folder 3Folder 4

Folder 1 内部,我有一个名为hello.txt 的文本文件,该文件的内容是hello

我的预期输出是"Directory of the file" + "file name" + "file body"

下面是我现在的代码。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;

import org.apache.commons.io.FileUtils;

public class FileDirectories {

    public static void main(String[] args) throws IOException {
        File[] files = new File("C:\\Search Files").listFiles();
        showFiles(files);
    }

    public static void showFiles(File[] files) throws IOException {
        String line = null;
        
            try{
                for (File file : files) {
                    if (file.isDirectory()) {
                        String fileName = "Directory" + file.getName();
                        //System.out.println("Directory: " + file.getName());
                        BufferedReader in = new BufferedReader(new FileReader(file));
                        while((line = in.readLine()) != null)
                        {
                            System.out.println(line);
                        }
                        in.close();
                        showFiles(file.listFiles()); // Calls same method again.
                    } else {
                        System.out.println("File: " + file.getName() + file.toString());
                    }
                }
            }catch(NullPointerException e){
                e.printStackTrace();
            }
        
        
        
        
        /*Iterator<File> it = FileUtils.iterateFiles(new File("C://Search Files//"), null, false);
        while(it.hasNext()) {
            System.out.println(((File) it.next()).getName());
        }*/
    }
}

当我执行上面的代码时,我得到以下错误:

 Exception in thread "main" java.io.FileNotFoundException: C:\Search   Files\Folder 1 (Access is denied)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:146)
        at java.io.FileReader.<init>(FileReader.java:72)
        at org.raghav.stuff.FileDirectories.showFiles(FileDirectories.java:27)
        at org.raghav.stuff.FileDirectories.main(FileDirectories.java:16)

再次,我需要获取文件目录、文件名和文件内容。

如果是hello.txt,预期的输出应该是: C:\Search Files\Folder1\ hello.txt hello

你们能指出我正确的方向吗?如何修复上述异常以及如何获取显示目录、文件名和文件内容的字符串?

【问题讨论】:

  • 您的阅读代码在if (file.isDirectory()) { 块中 - 您正在尝试阅读目录
  • 你会如何解决它?
  • 好吧,显然不要这样做 :) 你在那里有一个文件的 else 子句,那是你应该使用阅读器的地方。

标签: java file exception


【解决方案1】:

您的代码看起来不错,但您必须按如下方式组织它,尤其是 showFiles 方法。

public static void showFiles(File[] files) throws IOException {
    String line = null;

    try{
        for (File file : files) {
            if (file.isDirectory()) {
                String fileName = "Directory: " + file.getName();
                System.out.print(fileName);
                showFiles(file.listFiles()); // Calls same method again.
            } else {
                System.out.print("\tFile: " + file.getName() + file.toString());
                //System.out.println("Directory: " + file.getName());
                BufferedReader in = new BufferedReader(new FileReader(file));
                while((line = in.readLine()) != null)
                {
                    System.out.print("\t Content:" + line);
                }
                in.close();
                System.out.println();
            }
        }
    }catch(NullPointerException e){
        e.printStackTrace();
    }

输出将如下所示:

Directory: Folder 1 File: C:\Search Files\Folder 1\test.txt  Content:this is a test
Directory: Folder 2 File: C:\Search Files\Folder 2\test.txt  Content:this is a test
Directory: Folder 3 File: C:\Search Files\Folder 3\test.txt  Content:this is a test
Directory: Folder 4 File: C:\Search Files\Folder 4\test.txt  Content:this is a test

【讨论】:

  • 能否请您也添加一些解释?你做了什么改变,为什么?
  • 当然。我将代码移动到 if(file.isDirectory()) 的 else 部分中读取文件,因为如果它是一个目录,那么您想再次递归调用 showFiles() 方法,否则打印内容。
猜你喜欢
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多