2010-01-20 44 views
63

我正在尋找一種方法來獲取與給定目錄中的模式(pref regex)匹配的文件列表。列出與Java中的模式匹配的目錄中的文件

我找到了一個在線教程,使用Apache的公地IO包用下面的代碼:

Collection getAllFilesThatMatchFilenameExtension(String directoryName, String extension) 
{ 
    File directory = new File(directoryName); 
    return FileUtils.listFiles(directory, new WildcardFileFilter(extension), null); 
} 

但是,這只是返回一個基本集合(據the docs它是java.io.File集合)。有沒有辦法做到這一點,返回一個類型安全的泛型集合?

+0

爲什麼不你只需添加一個演員?我想基礎集合是出於兼容性原因(使用較老的java版本)。如果你想絕對確定,你可以創建一個副本並在類型檢查後添加元素(無論如何,泛型只是編譯時檢查) – bertolami 2010-01-20 16:38:16

+0

@bertolami,不要在註釋中放入答案。 :) – 2015-03-16 18:08:13

+1

5年後發表評論...這是一些強大的巫術在那裏@LimitedAtonement – 2015-03-16 18:10:47

回答

96

請參閱File#listFiles(FilenameFilter)

File dir = new File("."); 
File [] files = dir.listFiles(new FilenameFilter() { 
    @Override 
    public boolean accept(File dir, String name) { 
     return name.endsWith(".xml"); 
    } 
}); 

for (File xmlfile : files) { 
    System.out.println(xmlfile); 
} 
+1

這意味着java讀入所有文件,然後丟棄那些不匹配的文件。與任何過濾自身的系統命令相比,這不是很慢嗎? – flaschenpost 2015-01-12 17:31:45

+1

@flaschenpost不一定,因爲文檔對實現如何處理緩存和其他性能相關細節沒有任何承諾。這種類型的任何方法的主要限制是IO調用磁盤讀取文件元數據。系統命令仍然需要讀取所有相同的信息,因此它可能足夠接近,不值得擔心。使用純Java處理它可以讓別人處理與獲取元數據相關的平臺特定問題。 – Morgen 2015-01-15 20:04:00

+1

好的。我習慣於使用'glob'方法對所有語言進行操作,我希望它能夠在文件系統實現中運行,並且速度要快100倍左右(但沒有檢查過)。但是我仍然必須習慣java風格,其中'快'表示秒而不是納秒。 ;-) – flaschenpost 2015-01-15 21:00:56

14

下面的代碼將創建一個基於FileNameFilter的接受方法的文件列表。

List<File> list = Arrays.asList(dir.listFiles(new FilenameFilter(){ 
     @Override 
     public boolean accept(File dir, String name) { 
      return name.endsWith(".exe"); // or something else 
     }})); 
+0

這需要指定模式匹配位。 – BobMcGee 2010-01-20 16:33:22

0

怎麼樣在你的現有代碼的包裝:

public Collection<File> getMatchingFiles(String directory, String extension) { 
    return new ArrayList<File>()( 
     getAllFilesThatMatchFilenameExtension(directory, extension)); 
} 

我會扔雖然一個警告。如果你能忍受這個警告,那麼你就完成了。

12

由於Java 7,您可以將java.nio封裝中實現相同的結果:

Path dir = ...; 
List<File> files = new ArrayList<>(); 
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "*.{java,class,jar}")) { 
    for (Path entry: stream) { 
     files.add(entry.toFile()); 
    } 
    return files; 
} catch (IOException x) { 
    throw new RuntimeException(String.format("error reading folder %s: %s", 
    dir, 
    x.getMessage()), 
    x); 
} 
25

由於Java 8,你可以使用lambda表達式,實現更短的代碼:

File dir = new File(xmlFilesDirectory); 
File[] files = dir.listFiles((d, name) -> name.endsWith(".xml")); 
1
import java.io.BufferedReader; 

import java.io.File; 

import java.io.FileReader; 

import java.io.IOException; 

import java.util.Map; 

import java.util.Scanner; 

import java.util.TreeMap; 

public class CharCountFromAllFilesInFolder { 

    public static void main(String[] args)throws IOException { 

     try{ 

      //C:\Users\MD\Desktop\Test1 

      System.out.println("Enter Your FilePath:"); 

      Scanner sc = new Scanner(System.in); 

      Map<Character,Integer> hm = new TreeMap<Character, Integer>(); 

      String s1 = sc.nextLine(); 

      File file = new File(s1); 

      File[] filearr = file.listFiles(); 

      for (File file2 : filearr) { 
       System.out.println(file2.getName()); 
       FileReader fr = new FileReader(file2); 
       BufferedReader br = new BufferedReader(fr); 
       String s2 = br.readLine(); 
       for (int i = 0; i < s2.length(); i++) { 
        if(!hm.containsKey(s2.charAt(i))){ 
         hm.put(s2.charAt(i), 1); 
        }//if 
        else{ 
         hm.put(s2.charAt(i), hm.get(s2.charAt(i))+1); 
        }//else 

       }//for2 

       System.out.println("The Char Count: "+hm); 
      }//for1 

     }//try 
     catch(Exception e){ 
      System.out.println("Please Give Correct File Path:"); 
     }//catch 
    } 
} 
相關問題