2011-01-31 17 views
34

Cosa devo fare se la ricerca di una cartella dire C:\exampletrovare i file in una cartella utilizzando Java

Ho quindi bisogno di passare attraverso ogni file e controllare per vedere se corrisponde a un paio di caratteri di inizio, quindi se i file iniziano

temp****.txt 
tempONE.txt 
tempTWO.txt 

quindi, se il file inizia con temp e ha un'estensione .txt Vorrei poi mettere quel nome file in un File file = new File("C:/example/temp***.txt); modo che io possa poi leggere nel file, il ciclo poi ha bisogno di passare al file successivo alla controllare per vedere se soddisfa come sopra.

risposta

59

Quello che desideri è File.listFiles(FileNameFilter filter).

Questo ti darà un elenco dei file nella directory che vuoi che corrispondono ad un determinato filtro.

Il codice sarà simile a:

// your directory 
File f = new File("C:\\example"); 
File[] matchingFiles = f.listFiles(new FilenameFilter() { 
    public boolean accept(File dir, String name) { 
     return name.startsWith("temp") && name.endsWith("txt"); 
    } 
}); 
+2

BTW Java può gestire la barra ('/') bene sotto Windows. Quindi non c'è bisogno di backslash (e di evaderlo). –

+1

Se hai meno di Java 7, si potrebbe/dovrebbe utilizzare java.nio.FileSystems.getDefault(). GetPath (String dir1, String dir2, ...) per concatenare directory/file in modo "multipiattaforma" veramente – beder

+0

@ beder È 'java.nio.file.FileSystems' – TheRealChx101

2

Dai un'occhiata alla java.io.File.list() e FilenameFilter.

29

È possibile utilizzare un FilenameFilter, in questo modo:

File dir = new File(directory); 

File[] matches = dir.listFiles(new FilenameFilter() 
{ 
    public boolean accept(File dir, String name) 
    { 
    return name.startsWith("temp") && name.endsWith(".txt"); 
    } 
}); 
+1

+1 per avere nomi di variabili leggermente più piacevoli rispetto al codice quasi identico pubblicato 2 minuti prima del tuo. –

+1

@Null Set, la risposta è stata scritta mentre stavo scrivendo la mia, quindi non è come se avessi copiato ciò che Justin ha scritto e ribattezzato le variabili ... :) Grazie per l'up-voto, però. –

+0

'+ 1' Per pensare esattamente come ho fatto io. – jjnguy

3

consideri Apache Commons IO, ha una classe denominata FileUtils che ha un metodo listFiles che potrebbe essere molto utile nel vostro caso.

1

Appache Commons IO vari

FilenameUtils.wildcardMatch

See Apache javadoc here. Corrisponde al carattere jolly con il nome file. Quindi puoi usare questo metodo per i tuoi confronti.

+0

Le risposte sintetiche sono quindi soggette a essere contrassegnate come di bassa qualità. – joaquin

+0

La mia reputazione non mi consente di aggiungere commenti. L'unico modo per contribuire è aggiungere un'altra risposta. Ho modificato il mio post originale per aggiungere ulteriori dettagli. – eugene

2

Per elencare i file Json dalla directory specificata.

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

    public class ListOutFilesInDir { 
     public static void main(String[] args) throws Exception { 

      File[] fileList = getFileList("directory path"); 

      for(File file : fileList) { 
       System.out.println(file.getName()); 
      } 
     } 

     private static File[] getFileList(String dirPath) { 
      File dir = new File(dirPath); 

      File[] fileList = dir.listFiles(new FilenameFilter() { 
       public boolean accept(File dir, String name) { 
        return name.endsWith(".json"); 
       } 
      }); 
      return fileList; 
     } 
    } 
1

Come ha detto @Clarke, è possibile utilizzare java.io.FilenameFilter per filtrare il file condizione specifica.

Come complemento, mi piacerebbe mostrare come utilizzare java.io.FilenameFilter per cercare il file nella directory corrente e la sua sottodirectory.

I metodi comuni getTargetFiles e printFiles vengono utilizzati per cercare i file e stamparli.

public class SearchFiles { 

    //It's used in dfs 
    private Map<String, Boolean> map = new HashMap<String, Boolean>(); 

    private File root; 

    public SearchFiles(File root){ 
     this.root = root; 
    } 

    /** 
    * List eligible files on current path 
    * @param directory 
    *  The directory to be searched 
    * @return 
    *  Eligible files 
    */ 
    private String[] getTargetFiles(File directory){ 
     if(directory == null){ 
      return null; 
     } 

     String[] files = directory.list(new FilenameFilter(){ 

      @Override 
      public boolean accept(File dir, String name) { 
       // TODO Auto-generated method stub 
       return name.startsWith("Temp") && name.endsWith(".txt"); 
      } 

     }); 

     return files; 
    } 

    /** 
    * Print all eligible files 
    */ 
    private void printFiles(String[] targets){ 
     for(String target: targets){ 
      System.out.println(target); 
     } 
    } 
} 

io demo come utilizzare ricorsiva, BFS e DFS per ottenere il lavoro fatto.

ricorsivo:

/** 
* How many files in the parent directory and its subdirectory <br> 
* depends on how many files in each subdirectory and their subdirectory 
*/ 
private void recursive(File path){ 

    printFiles(getTargetFiles(path)); 
    for(File file: path.listFiles()){ 
     if(file.isDirectory()){ 
      recursive(file); 
     } 
    } 
    if(path.isDirectory()){ 
     printFiles(getTargetFiles(path)); 
    } 
} 

public static void main(String args[]){ 
    SearchFiles searcher = new SearchFiles(new File("C:\\example")); 
    searcher.recursive(searcher.root); 
} 

ricerca in ampiezza:

/** 
* Search the node's neighbors firstly before moving to the next level neighbors 
*/ 
private void bfs(){ 
    if(root == null){ 
     return; 
    } 

    Queue<File> queue = new LinkedList<File>(); 
    queue.add(root); 

    while(!queue.isEmpty()){ 
     File node = queue.remove(); 
     printFiles(getTargetFiles(node)); 
     File[] childs = node.listFiles(new FileFilter(){ 

      @Override 
      public boolean accept(File pathname) { 
       // TODO Auto-generated method stub 
       if(pathname.isDirectory()) 
        return true; 

       return false; 
      } 

     }); 

     if(childs != null){ 
      for(File child: childs){ 
       queue.add(child); 
      } 
     } 
    } 
} 

public static void main(String args[]){ 
    SearchFiles searcher = new SearchFiles(new File("C:\\example")); 
    searcher.bfs(); 
} 

ricerca in profondità:

/** * Ricerca per quanto possibile lungo ogni ramo bef minerale di backtracking */ DFS private void() {

if(root == null){ 
     return; 
    } 

    Stack<File> stack = new Stack<File>(); 
    stack.push(root); 
    map.put(root.getAbsolutePath(), true); 
    while(!stack.isEmpty()){ 
     File node = stack.peek(); 
     File child = getUnvisitedChild(node); 

     if(child != null){ 
      stack.push(child); 
      printFiles(getTargetFiles(child)); 
      map.put(child.getAbsolutePath(), true); 
     }else{ 
      stack.pop(); 
     } 

    } 
} 

/** 
* Get unvisited node of the node 
* 
*/ 
private File getUnvisitedChild(File node){ 

    File[] childs = node.listFiles(new FileFilter(){ 

     @Override 
     public boolean accept(File pathname) { 
      // TODO Auto-generated method stub 
      if(pathname.isDirectory()) 
       return true; 

      return false; 
     } 

    }); 

    if(childs == null){ 
     return null; 
    } 

    for(File child: childs){ 

     if(map.containsKey(child.getAbsolutePath()) == false){ 
      map.put(child.getAbsolutePath(), false); 
     } 

     if(map.get(child.getAbsolutePath()) == false){ 
      return child; 
     } 
    } 

    return null; 
} 

public static void main(String args[]){ 
    SearchFiles searcher = new SearchFiles(new File("C:\\example")); 
    searcher.dfs(); 
} 
5

lo so, questa è una vecchia questione. Ma solo per completezza, la versione lambda.

File dir = new File(directory); 
File[] files = dir.listFiles((dir1, name) -> name.startsWith("temp") && name.endsWith(".txt")); 
Problemi correlati