2011-01-31 3 views
34

Что мне нужно делать, если поиск папки говорят C:\exampleНайти файлы в папке с помощью Java

то мне нужно пройти через каждый файл и проверьте, чтобы увидеть, если он соответствует несколько начальных символов, так что если файлы начинаются

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

так что, если файл начинается с температурой и имеет расширение .txt, я хотел бы, чтобы затем положить, что имя файла в File file = new File("C:/example/temp***.txt); так что я могу затем прочитать в файле, цикл затем необходимо перейти на следующий файл в проверьте, соответствует ли он, как указано выше.

ответ

59

Что вы хотите, это File.listFiles(FileNameFilter filter).

Это даст вам список файлов в каталоге, который вы хотите, чтобы соответствовать определенному фильтру.

Код будет выглядеть примерно так:

// 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 может обрабатывать косую черту ('/') просто отлично под Windows. Таким образом, нет необходимости в обратном следе (и избегать его). –

+1

Если вы находитесь под Java 7, вы можете/должны использовать java.nio.FileSystems.getDefault(). GetPath (String dir1, String dir2, ...) для конкатенации каталогов/файлов по-настоящему «мультиплатформенным способом» – beder

+0

@ beder Это 'java.nio.file.FileSystems' – TheRealChx101

29

Вы можете использовать FilenameFilter, например, так:

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 для того, чтобы иметь несколько более приятные имена переменных, чем почти идентичный код, отправленный за 2 минуты до вашего. –

+1

@Null Set, этот ответ был написан во время моего написания, поэтому я не копировал то, что написал Джастин и переименовал переменные ... :) Спасибо за голосование. –

+0

'+ 1' Для того, чтобы думать точно так же, как и я. – jjnguy

3

Рассмотрим Apache Commons IO, то есть класс, называемый FileUtils, который имеет listFiles метод, который может быть очень полезным в вашем случае.

1

Appache Обще IO различных

FilenameUtils.wildcardMatch

См Apache Javadoc here. Он соответствует шаблону с именем файла. Таким образом, вы можете использовать этот метод для своих сравнений.

+0

. Таким образом, краткие ответы подвержены помехам как низкое качество. – joaquin

+0

Моя репутация не позволяет добавить комментарий. Единственный способ внести свой вклад - добавить еще один ответ. Я редактировал свое оригинальное сообщение, чтобы добавить более подробную информацию. – eugene

2

Чтобы просмотреть список Json-файлов из вашего каталога.

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

Как сказал @Clarke, вы можете использовать java.io.FilenameFilter для фильтрации файлов по определенному условию.

В качестве дополнительного я хотел бы показать, как использовать java.io.FilenameFilter для поиска файла в текущей директории и в ее подкаталоге.

Общие методы getTargetFiles и printFiles используются для поиска файлов и их печати.

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); 
     } 
    } 
} 

Я демо, как использовать рекурсивный, BFS и на глубину получить работу.

Рекурсивный:

/** 
* 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); 
} 

поиск в ширину:

/** 
* 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(); 
} 

Глубина поиска в:

/** * Поиск, насколько это возможно по каждой ветка bef руда возвратов */ частных пустоты в глубине() {

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

Я знаю, что это старый вопрос. Но только ради полноты, лямбда-версия.

File dir = new File(directory); 
File[] files = dir.listFiles((dir1, name) -> name.startsWith("temp") && name.endsWith(".txt")); 
Смежные вопросы