2010-06-10 208 views
2

以下代碼遍歷所有目錄和子目錄,並輸出.java文件;從目錄中讀取文件並從Java中過濾文件

import java.io.File; 


public class DirectoryReader { 
    private static String extension = "none"; 
    private static String fileName; 

    public static void main(String[] args){ 
     String dir = "C:/tmp"; 
     File aFile = new File(dir); 
     ReadDirectory(aFile); 
    } 
    private static void ReadDirectory(File aFile) { 
     File[] listOfFiles = aFile.listFiles(); 
     if (aFile.isDirectory()) { 
      listOfFiles = aFile.listFiles(); 
      if(listOfFiles!=null) { 
       for(int i=0; i < listOfFiles.length; i++ ) { 
        if (listOfFiles[i].isFile()) { 

         fileName = listOfFiles[i].toString(); 
         int dotPos = fileName.lastIndexOf("."); 
         if (dotPos > 0) { 
          extension = fileName.substring(dotPos); 
         }      
         if (extension.equals(".java")) { 
         System.out.println("FILE:" + listOfFiles[i]); 
         } 
        }   
        if(listOfFiles[i].isDirectory()) { 
         ReadDirectory(listOfFiles[i]); 
        } 
       } 
      } 
     } 
    } 


} 

這是否高效?可以做些什麼來提高速度?

歡迎任何想法。

+1

存在一個錯誤:沒有擴展名的文件將被視爲當程序看到最後一個擴展名時。不需要兩次調用listFiles。使用.getPath()而不是.toString()來獲取文件路徑(結果相同,可讀性更好) – unbeli 2010-06-10 09:22:45

+0

@unbeli謝謝。 – Adnan 2010-06-10 09:24:50

回答

2

我的評論:

  • 可能的錯誤:extension不復位。想想,如果你ecounter file1.java和THES file2會發生什麼

    建議(無.個字符數):把

    if (extension.equals(".java")) 
        System.out.println("FILE:" + listOfFiles[i]); 
    

    if (dotPos > 0)

  • ReadDirectory體內是一種方法和應accourding to convention有小首字母:readDirectory

  • 你可以清理代碼中的比特通過使用for-each循環:

    for(File f : listOfFiles) { 
        if (f.isFile()) { 
         // ... 
        }   
        if(f.isDirectory()) { 
         readDirectory(f); 
        } 
    } 
    
+0

謝謝,點了。 – Adnan 2010-06-10 09:27:53

0

使用StringBuffer代替的System.out。遞歸總是比較慢,儘管更簡潔。

3

在Java 7,我會考慮這樣的:

Files.walkFileTree(aFile.toPath(), new SimpleFileVisitor<Path>() 
{ 
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) 
    { 
    if(file.getFileName().endsWith(".java") 
    { 
     System.out.println("FILE:" + file); 
    } 
    return FileVisitResult.CONTINUE; 
    } 
}); 

這可能不是快,但我覺得它更具可讀性。

編輯:我刪除了當前的Java示例。 listFiles不是遞歸的,所以你可以使用它,但你將不得不使用自己的遞歸。您也可能需要兩個listFiles調用(用於Java文件和目錄),或者您需要一個匹配兩者的FileFilter。在後一種情況下,您將不得不檢查返回數組中的每個文件以查看它是哪個文件。

+0

不錯的一個,它真的更具可讀性。謝謝。 – Adnan 2010-06-10 09:38:51

+0

file.getName()應該替換爲file.getFileName(),因爲getName(index)期望作爲參數返回元素的名稱 – magiccrafter 2015-04-03 13:31:23

+0

@magiccrafter,謝謝,完成。 – 2015-04-10 05:26:42