2009-09-06 22 views
45

Belirli bir klasörü ayrıştıracak ve .txt dosyaları için arama yapabilecek bir yerleşik Java kodu var mı?Java: Belirtilen klasördeki .txt dosyalarını bulun

+2

tüm metin dosyaları eklemek için benim son kodudur? – Milhous

+0

Ayrıca bkz. Http://stackoverflow.com/questions/794381/how-to-find-files-that-match-a-wildcard-string-in-java – Vadzim

+5

Bu gerçek bir soru. Kapanmak için olması gerektiği kadar anlaşılması zor olsaydı, o zaman sadece soruyu mükemmel bir şekilde cevaplamakla kalmayıp, aynı zamanda 89 tane de olumlu yanıtı içeren bir cevap olmazdı. – SpaceCore186

cevap

110

Sen java.io.File sınıfı tarafından sağlanan listFiles() yöntemi kullanabilirsiniz olduğunu.

import java.io.File; 
import java.io.FilenameFilter; 

public class Filter { 

    public File[] finder(String dirName){ 
     File dir = new File(dirName); 

     return dir.listFiles(new FilenameFilter() { 
       public boolean accept(File dir, String filename) 
         { return filename.endsWith(".txt"); } 
     }); 

    } 

} 
+1

@Funsuk, bu benim için gayet iyi çalışıyor, en azından denediğim basit test vakaları için. 36 kişi aynı fikirde. Hangi şekilde sizin için işe yaramıyor? – djna

20

Dene:

List<String> textFiles(String directory) { 
    List<String> textFiles = new ArrayList<String>(); 
    File dir = new File(directory); 
    for (File file : dir.listFiles()) { 
    if (file.getName().endsWith((".txt"))) { 
     textFiles.add(file.getName()); 
    } 
    } 
    return textFiles; 
} 

Sen bu durumda bir olgu duyarsız arama yapmak istiyorum: özyinelemeli metin dosyaları için bir dizin ağacında aramak istiyorsanız

if (file.getName().toLowerCase().endsWith((".txt"))) { 

, sen olmalı Yukardakileri ya bir tekrarlama fonksiyonu ya da bir istif ile tekrarlayan bir fonksiyon olarak adapte edebilir.

+0

Güzel görünüyor. Bunu deneyeyim .. – Sri

-2

İşte benim platforma özel kodu (unix)

public static List<File> findFiles(String dir, String... names) 
    { 
     LinkedList<String> command = new LinkedList<String>(); 
     command.add("/usr/bin/find"); 
     command.add(dir); 
     List<File> result = new LinkedList<File>(); 
     if (names.length > 1) 
      { 
       List<String> newNames = new LinkedList<String>(Arrays.asList(names)); 
       String first = newNames.remove(0); 
       command.add("-name"); 
       command.add(first); 
       for (String newName : newNames) 
        { 
         command.add("-or"); 
         command.add("-name"); 
         command.add(newName); 
        } 
      } 
     else if (names.length > 0) 
      { 
       command.add("-name"); 
       command.add(names[0]); 
      } 
     try 
      { 
       ProcessBuilder pb = new ProcessBuilder(command); 
       Process p = pb.start(); 
       p.waitFor(); 
       InputStream is = p.getInputStream(); 
       InputStreamReader isr = new InputStreamReader(is); 
       BufferedReader br = new BufferedReader(isr); 
       String line; 
       while ((line = br.readLine()) != null) 
        { 
         // System.err.println(line); 
         result.add(new File(line)); 
        } 
       p.destroy(); 
      } 
     catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     return result; 
    } 
+4

Neden daha kolay, platformlar arası bir çözüm mevcut olduğunda, bunu kullanmak istesin? – BlueSilver

+0

Yerel bir sürümü kullanmanın bir nedeni, uzun bir dizinde çok sayıda dosyanın okunmasını engellemektir. Java 6'da, java.io.File sınıfı bir dizindeki dosyaları akış olarak veya bir yineleyici kullanarak okuyan yöntemleri içermez. File.listFiles (FileFilter) 've' File'ın Java 6 uygulamaları.listFiles (FilenameFilter) 'her ikisi de ilk önce tüm dosyaları bir dizinden okur ve sonra filtreyi uygular. Milyonlarca dosya içeren bir diziyle karşılaşıldığında, örneğin, File.listFiles, JVM'deki tüm yığın belleği tüketebileceği çok sayıda dosya okuyabilir. –

+0

Bkz. Http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/21487ef30163/src/share/classes/java/io/File.java, File.listFiles (FileFilter) 'ın uygulanması için. –

6

Gerçekten kullanışlı, hafif bir değişiklik ile kullandı:

filename=directory.list(new FilenameFilter() { 
    public boolean accept(File dir, String filename) { 
     return filename.startsWith(ipro); 
    } 
}); 
16
import org.apache.commons.io.filefilter.WildcardFileFilter; 

......... 
......... 

File dir = new File(fileDir); 
FileFilter fileFilter = new WildcardFileFilter("*.txt"); 
File[] files = dir.listFiles(fileFilter); 

Yukarıdaki kod ben buldum yayınları temel benim çözüm yapılmış

2

benim için büyük işler burada Google ile. Ve eski bir iş parçacığı olsa bile, benimkilere de zarar vermenin bir zararı olmadığını düşündüm.

Bu kodun verdiği tek artı, alt dizinlerde de yineleyebilmesidir. aşağıdaki gibi

import java.io.File; 
import java.io.FileFilter; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import org.apache.commons.io.filefilter.DirectoryFileFilter; 
import org.apache.commons.io.filefilter.WildcardFileFilter; 

yöntem olup:

List <File> exploreThis(String dirPath){ 

    File topDir = new File(dirPath); 

    List<File> directories = new ArrayList<>(); 
    directories.add(topDir); 

    List<File> textFiles = new ArrayList<>(); 

    List<String> filterWildcards = new ArrayList<>(); 
    filterWildcards.add("*.txt"); 
    filterWildcards.add("*.doc"); 

    FileFilter typeFilter = new WildcardFileFilter(filterWildcards); 

    while (directories.isEmpty() == false) 
    { 
     List<File> subDirectories = new ArrayList(); 

     for(File f : directories) 
     { 
      subDirectories.addAll(Arrays.asList(f.listFiles((FileFilter)DirectoryFileFilter.INSTANCE))); 
      textFiles.addAll(Arrays.asList(f.listFiles(typeFilter))); 
     } 

     directories.clear(); 
     directories.addAll(subDirectories); 
    } 

    return textFiles; 
} 
-2

içe org.apache.commons.io.FileUtils;

Liste htmFileList = new ArrayList(); için

(Dosya dosyası: (Liste) FileUtils.listFiles (yeni Dosyası (SRCDIRın), new String [] { "txt", "TXT"}, true)) { htmFileList.add (dosya); }

Bu cevap platforma özel olmak olabilir bir dizin

1
import java.io.IOException; 
import java.nio.file.FileSystems; 
import java.nio.file.FileVisitResult; 
import java.nio.file.Path; 
import java.nio.file.PathMatcher; 
import java.nio.file.SimpleFileVisitor; 
import java.nio.file.attribute.BasicFileAttributes; 
import java.util.ArrayList; 

public class FileFinder extends SimpleFileVisitor<Path> { 
    private PathMatcher matcher; 
    public ArrayList<Path> foundPaths = new ArrayList<>(); 

    public FileFinder(String pattern) { 
     matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern); 
    } 

    @Override 
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { 
     Path name = file.getFileName(); 

     if (matcher.matches(name)) { 
      foundPaths.add(file); 
     } 

     return FileVisitResult.CONTINUE; 
    } 
} 

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.LinkOption; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.util.ArrayList; 

public class Main { 
    public static void main(String[] args) throws IOException { 
     Path fileDir = Paths.get("files"); 
     FileFinder finder = new FileFinder("*.txt"); 
     Files.walkFileTree(fileDir, finder); 

     ArrayList<Path> foundFiles = finder.foundPaths; 

     if (foundFiles.size() > 0) { 
      for (Path path : foundFiles) { 
       System.out.println(path.toRealPath(LinkOption.NOFOLLOW_LINKS)); 
      } 
     } else { 
      System.out.println("No files were founds!"); 
     } 
    } 
} 
İlgili konular