2009-04-24 4 views
5

Я хочу реализовать метод, как это:Как реализовать метод для возврата итератора файлов рекурсивно в Java

public Iterator<File> getFiles(String root) { 
    // return an Iterator looping through all files in root and all files in sub-directories of roots (recursively) 
} 

В C#, это может быть легко реализовано с yield return ключевого слова. На Java я подозреваю, что мне нужно написать много сложного кода, чтобы это сделать. Есть ли хорошее решение этой проблемы?

Edit: Я хочу возвращаемый итератор быть «ленивым», то есть только вернуть новый файл, когда next() вызывается. (Это поведение C# yield return.)

+0

Не могли бы вы объяснить, почему вы хотите, чтобы он ленился? –

+1

Поскольку я не обязательно просматриваю все следующие(), мне может понадобиться остановиться между ними (например, пользователи нажимают «Стоп»). Высокая загрузка структуры очень глубоких каталогов является дорогостоящей, если она нам не нужна. –

ответ

3

Apache Commons FileUtils предлагает iterator методы для итерации по каталогам и поддиректориям. Это делает то, что вы хотите, и должно сэкономить вам много работы.

например.

Iterator fi = iterateFiles(new File("."), String[] {".csv"}, true)

найти все .csv файлы в текущем каталоге.

+1

Как я вижу в исходном коде, оказывается, что код добавляет все файлы в коллекцию и, наконец, вызывает метод iterator() в этой коллекции. Я хочу ленивый, не нетерпеливый Итератор. Я обновил оригинальный пост. Спасибо за то, что вы все равно это принесете, пригодится в других случаях. –

+0

Хорошо. В этом случае, я думаю, вам может понадобиться рекурсивный метод и предоставить свой собственный объект обратного вызова. К сожалению, я не имею ни малейшего представления. –

+0

он не работает для итерирования папки, хотя –

0

я мог бы что-то пропустил, но почему бы не просто сделать свой собственный итератор класса, который реализует итератор. Тогда вам просто нужно реализовать ленивый метод next() в вашем итераторе.

+0

Уверен, что я бы это сделал, если кто-то уже не решил эту проблему более разумными способами, которые я мог бы придумать. И этот ответ, кажется, предлагает 1 из таких решений http://stackoverflow.com/questions/785228/how-to-implement-a-method-to-return-iterator-of-files-recursively-in-java/785236# 785236 –

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