2013-10-25 3 views
0

Доброе утро в моем часовом поясе.Клон Итератор FileUtils

У меня есть следующий код:

Iterator<File> files = FileUtils.iterateFiles(new File(directoryPath), new String[]{"java"}, true); 

     for(String file : ws){ 
      while(files.hasNext()){ 
       current = files.next(); 
       if(!current.isDirectory()){ 
        if(current.getName().matches(file+".*ServiceProxy.*")){ 
     //I need to start the cycle again from the beginning to search in each 
    //file for the ServiceProxy string 
    //Something like this 
      // cloneFiles = files.clone(); 
     //while(cloneFiles.hasNext()){ 
       file = files.next(); 
       //search inside the file code 
     } 
        } 
       } 
      } 
     } 

Я хочу клонировать итератора, потому что это действие очень дорого с точки зрения времени

FileUtils.iterateFiles(new File(directoryPath), new String[]{"java"}, true); 

Заранее спасибо С наилучшими пожеланиями

ответ

0

Вы можете использовать Iterable:

Iterable<File> filesIterable = new Iterable<>(){ 
    public Iterator<File> iterator() { 
     return FileUtils.iterateFiles(...); 
    } 
}; 

... 

for (File file : filesIterable) { 
    ... 
} 

// ... and you may reuse it over and over. 
// For each cycle declaration there will be a new `Iterator` created. 

for (File file : filesIterable) { 
    ... 
} 

Это работает так:

  1. for-each петля просит filesIterable создать новые вызовы Iterator
  2. filesIterableiterator()
  3. FileUtils.iterateFiles создает новый Iterator
+0

Но если я использую filesIterable object, то не будут изменены FilesUtils.iterateFiles? Do not filesIterable object использует ссылку для объекта FilesUtils.iterateFiles? Спасибо за быстрый ответ – tt0686

+0

Обновлен ответ. Пожалуйста. –

+0

Проблема с этим aproach заключается в том, что он всегда вызывает в моем случае FileUtils.iterateFiles (новый файл (directoryPath), новый String [] {"java"}, true); , и это то, чего я хочу избежать, потому что это очень дорогостоящая операция, поэтому я хочу клонировать Iterator, что эта функция возвращает Спасибо за ответ i your time – tt0686

0

Вы можете использовать

Collection<File> files = FileUtils.listFiles(new File(directoryPath), 
    new String[]{"java"}, true); 

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

Смежные вопросы