Как сделать поток из DirectoryStream

При чтении API для DirectoryStream я пропускаю много функций. Прежде всего, это предполагает использование цикла for для перехода из потока в List. И я пропускаю тот факт, что он DirectoryStream не является Stream.

Как я могу сделать Stream<Path> DirectoryStream в Java 8?

Ответы

Ответ 1

DirectoryStream не является Stream (он был там с Java 7 до того, как потоки api были введены в Java 8), но он реализует интерфейс Iterable<Path>, чтобы вы могли написать:

try (DirectoryStream<Path> ds = ...) {
  Stream<Path> s = StreamSupport.stream(ds.spliterator(), false);
}

Ответ 2

Хотя можно преобразовать a DirectoryStream в Stream, используя его метод spliterator, для этого нет оснований. Просто создайте Stream<Path> в первую очередь.

Например, вместо вызова Files.newDirectoryStream(Path) просто позвоните Files.list(Path).

Перегрузка newDirectoryStream, которая принимает дополнительный Filter, может быть заменена на Files.list(Path).filter(Predicate), и есть дополнительные операции, такие как Files.find и Files.walk, вернув Stream<Path>, однако я не нашел замены для случая, в котором вы хотите использовать "шаблон glob" . Это единственный случай, когда перевод DirectoryStream в Stream может быть полезным (я предпочитаю использовать регулярные выражения в любом случае)...

Ответ 3

DirectoryStream имеет метод, который возвращает разделитель. Так просто:

Stream<Path> stream = StreamSupport.stream(myDirectoryStream.spliterator(), false);

Возможно, вам захочется увидеть этот вопрос, что в основном сводится к вашей проблеме: Как создать поток из Iterable.

Ответ 4

Вот еще один пример успешного запуска на платформе Windows. Этот пример кода отвечает на вопрос в главном названии этого поста.

import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

//Using compiler java ver 1.7
class A { 
    public static void main(String[] args) throws Exception
    { 
        //Tested on dos directory system
       Path dir = Paths.get("c:\\a\\b\\");

       /**
        *
        * This try with exceptions block attempts to open the specified 
        * directory. 
        * 
        */
        try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir))
        {
            // This enhanced for loop block iterates through the specified 
            // directory and outputs each filename
            for(Path p: stream)
            {  
                System.out.println(p.getFileName());
            }

        }
        catch(Exception e)
        {
            System.out.println("problems locating directory");
        }
    }
 }