Как сделать поток из 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");
}
}
}