【问题标题】:How do you read in a file from a subdirectory in Java?如何从 Java 的子目录中读取文件?
【发布时间】:2019-08-12 21:42:57
【问题描述】:

我有一个名为 Class 的文件夹,它的两个子目录是 Lectures 和 Grades,在这两个子目录中是 txt 文件。如何从主目录 - 类访问子目录(可能还有子目录 Lectures 和 Grades 的其他子目录)?我知道我可以在代码中使用绝对路径,但我想从起始文件夹 Class 开始。到目前为止,我的代码如下:

public class Test {
    public static void main(String[] args) {
        File directory = new File("/Users/Desktop/Class");
        File[] folder = directory.listFiles();
        for (File aFile : folder) {
            // Stuck here...
        }
    }
}

对不起..我是 Java 新手..

【问题讨论】:

    标签: java recursion directory subdirectory


    【解决方案1】:

    可以递归调用该方法读取子目录下的文件

    public static void main(String[] args) {
        File currentDir = new File("/Users/Desktop/Class"); // current directory
        displayDirectoryFiles(currentDir);
    }
    
    public static void displayDirectoryFiles(File dir) {
        try {
            File[] files = dir.listFiles();
            for (File file : files) {
                if (file.isDirectory()) {
                    System.out.println("directory:" + file.getCanonicalPath());
                    displayDirectoryContents(file);
                } else {
                    System.out.println("     file:" + file.getCanonicalPath());
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    正确处理异常,目前只是打印堆栈跟踪

    【讨论】:

      【解决方案2】:

      你看过这个答案吗:Java, List only subdirectories from a directory, not files

      这也可能是一个解决方案,有几种方法:http://zetcode.com/articles/javalistdirectory/

      【讨论】:

        【解决方案3】:
        // Recursive Java program to print all files 
        // in a folder(and sub-folders) 
        
        import java.io.File; 
        
        public class GFG 
        { 
            static void RecursivePrint(File[] arr,int index,int level) 
            { 
                // terminate condition 
                if(index == arr.length) 
                    return; 
        
                // tabs for internal levels 
                for (int i = 0; i < level; i++) 
                    System.out.print("\t"); 
        
                // for files 
                if(arr[index].isFile()) 
                    System.out.println(arr[index].getName()); 
        
                // for sub-directories 
                else if(arr[index].isDirectory()) 
                { 
                    System.out.println("[" + arr[index].getName() + "]"); 
        
                    // recursion for sub-directories 
                    RecursivePrint(arr[index].listFiles(), 0, level + 1); 
                } 
        
                // recursion for main directory 
                RecursivePrint(arr,++index, level); 
            } 
        
            // Driver Method 
            public static void main(String[] args) 
            { 
                // Provide full path for directory(change accordingly) 
                String maindirpath = "C:\\Users\\Gaurav Miglani\\Desktop\\Test"; 
        
                // File object 
                File maindir = new File(maindirpath); 
        
                if(maindir.exists() && maindir.isDirectory()) 
                { 
                    // array for files and sub-directories 
                    // of directory pointed by maindir 
                    File arr[] = maindir.listFiles(); 
        
                    System.out.println("**********************************************"); 
                    System.out.println("Files from main directory : " + maindir); 
                    System.out.println("**********************************************"); 
        
                    // Calling recursive method 
                    RecursivePrint(arr,0,0); 
            } 
            } 
        } 
        

        【讨论】:

          【解决方案4】:

          除了 Ros5292 答案,这可以使用 Apache Commons IO 库来实现。

          public void iterateFilesAndDirectoriesUsingApacheCommons() {
                  Iterator it = FileUtils.iterateFilesAndDirs(new File("/Users/Desktop/"), TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
                  while (it.hasNext()) {
                      System.out.println(((File) it.next()).getName());
                  }
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-11-22
            • 1970-01-01
            • 2013-02-03
            • 2015-02-19
            • 1970-01-01
            • 2023-04-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多