2010-01-20 26 views
63

Belirli bir dizinde bir şablonla eşleşen dosyaların (pref regex) bir yolunu bulmanın bir yolunu arıyorum.Java'da bir desenle eşleşen bir dizindeki dosyaları listeleme

Aşağıdaki kod ile apache commons-io paketi kullanan bir öğretici çevrimiçi buldum:

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

Ama bu sadece (o java.io.File koleksiyonu var the docs göre) bir taban koleksiyonunu döndürür. Tip güvenli bir genel koleksiyon döndüren bir yolu var mı?

+0

neden olmasın sadece bir cast ekliyor musun? Baz koleksiyonunun uyumluluk nedenleriyle (eski java versiyonuyla) olduğunu varsayalım. Eğer kesinlikle emin olmak istiyorsanız, sadece bir kopyasını oluşturabilir ve bir tür kontrolünden sonra elementleri ekleyebilirsiniz (yine de jenerikler sadece zaman kontrollerini derler) – bertolami

+0

@bertolami, yorumlara cevap vermeyin. :) –

+1

Yorum yapıldıktan 5 yıl sonra ... Bu güçlü bir necromancy var @LimitedAtonement –

cevap

96

Bkz. 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

Bu, java'nın tüm dosyaları okuduğu ve eşleşmeyenleri atar olduğu anlamına gelir. Bu, kendisini filtreleyen herhangi bir sistem komutuna göre çok yavaş değil mi? – flaschenpost

+1

@flaschenpost Gerekmedikçe, dokümanlar, uygulamanın önbellekleme ve diğer performansla ilgili ayrıntıları nasıl ele aldığına dair herhangi bir vaatte bulunmadığından. Bu türdeki herhangi bir yöntemdeki büyük sınır, dosya meta verilerini okumak için diske giden IO çağrısıdır. Bir sistem komutunun hala aynı bilgiyi okuması gerekir, bu yüzden muhtemelen endişelenmeye değmeyecek kadar yakındır. Saf Java'da ele almak, bir başkasının bu meta verilere ulaşmakla ilgili platforma özgü sorunları ele almasını sağlar. – Morgen

+1

Tamam. Sadece 'glob' yöntemiyle tüm dilleri kullanıyorum ve dosya sistemi uygulamasında çalışmasını ve yaklaşık 100x daha hızlı olmasını bekliyorum (ancak bunu kontrol etmedim). Ama hala java tarzıyla alışmak zorundayım, burada 'fast' saniye yerine nanosaniye anlamına geliyor. ;-) – flaschenpost

14

Aşağıdaki kod FileNameFilter bölümünden kabul yöntemine dayalı dosyaların bir listesini oluşturur.

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

Bu, bir desen eşleştirme biti belirtmelidir. – BobMcGee

0

Ne varolan kod etrafında sarıcı hakkında: Ben gerçi bir uyarı atacağım

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

. Bu uyarı ile yaşayabilirsen, işin bitti.

12

yana java 7 yapabilirsiniz aynı sonucu elde etmek java.nio paketi:

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 beri lambdas kullanmak ve daha kısa kod elde edebilirsiniz:

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 
    } 
} 
İlgili konular