2016-04-28 7 views
2

В моем приложении для Android мне нужно найти, существует ли файл определенного формата в каталоге. Я написал код, и он работает хорошо, но если в каталоге слишком много каталогов, каждый из которых имеет много файлов и каталогов, он становится немного медленным.Самый эффективный способ найти файлы в определенном формате, которые существуют в каталоге

Примечание: Я также вычисления общих файлов .txt в в каталоге

Это мой код

int count = 0; 

private boolean containsTXT(File file) { 
     boolean result = false; 
     String fList[] = file.list(); 

     if (fList == null) 
      return false; 
     else { 
      for (int i = 0; i < fList.length; i++) { 
       File file = new File(file, fList[i]); 
       if (file.isFile() && (file.getName().endsWith("txt"))) { 
        result = true; 
        count++; // This counts total txt files in the dir 
       } else if (file.isDirectory()) { 
        result = containsTXT(file); 
       } 
      } 
     } 
     return result; 
    } 

я в основном следующие наиболее общий подход, но есть приложения, которые делают ту же работу что я пытаюсь сделать в своем приложении и быстрее. Кто-нибудь знает лучший подход или алгоритм для этой задачи? Благодаря !!

+0

Не используйте рекурсию. –

+0

Сделать это итеративным, а не рекурсивным, это хорошее начало, я бы сказал, –

+1

Нужно ли сканировать все или остановить его, когда он найдет первый файл txt? Похоже, вы можете изменить 'result = true' на' return true'. –

ответ

2

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

Collection<File> allTxtFiles = FileUtils.listFiles(folder, new String[]{"txt"}, true) 
int count = allTxtFiles.size(); 

Не уверен, если это будет быстрее, но это, как правило, рекомендуется использовать очень популярные библиотеки с открытым исходным кодом, а не изобретать колесо, потому что:

  1. вы не должны тратить время на разработку существующей функциональности,
  2. у них, скорее всего, нет ошибок, потому что они долгое время использовались многими людьми,
  3. они были рассмотрены множеством опытных программистов и большинства вероятно, очень эффективны и используют быстрые алгоритмы и т. д.,
  4. Они более читабельны другими разработчиками и вами позже.

Просто попробуйте и посмотрите, не работает ли оно для вас.

1

Вот ваш код немного изменен, чтобы использовать оценку короткого замыкания:

private boolean containsTXT(File file) { 
    String fList[] = file.list(); 

    if (fList == null) 
     return false; 
    for (int i = 0; i < fList.length; i++) { 
     File file = new File(file, fList[i]); 
     if (file.isFile() && (file.getName().endsWith("txt"))) 
      return true; 
     if (file.isDirectory() && containsTXT(file)) 
      return true; 
    } 
    return false; 
} 
+0

Спасибо, хотя это оптимизация, но моя потребность больше. Будет ли итеративный подход быстрее? – varunkr

0

Вы можете сделать это итеративным вместо рекурсивного путем проведения файлов, возникающих во время обхода в FIFO виде списка.

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

private boolean containsTXT(File rootPath) { 
    boolean result = false; 

    LinkedList<File> fileFIFO = new LinkedList<>(); 

    fileFIFO.add(rootPath); //Add root path to the fifo list 

    //Traverse the FIFO linkedlist until it's empty 
    while(!fileFIFO.isEmpty()){ 
     File file = fileFIFO.poll(); //Retrieve item from the head 

     System.out.println(file.getAbsolutePath()+"\n"); 

     if(file.isDirectory()){ //If retrieved item from fifo list is a directory 
      File[] filesInDir = file.listFiles(); 

      if(filesInDir != null){ 
       fileFIFO.addAll(Arrays.asList(file.listFiles())); //Add all files in directory to fifo 
      } 
     }else if(file.isFile() && (file.getName().endsWith("txt"))){ 
      result = true; 
      break; 
     } 
    } 

    System.out.println("ContainsTXT: "+result); 
    return result; 
} 

Причина для использования FIFO вида списка, так что обход в подкаталоги упорядочен так, как мы хотим.