Существует класс (который написан неправильно), который просто извлекает имена файлов из каталога:
Код: Выделить всё
public class StreamTest
{
public List getList(Path dir) {
return getStream(dir)
.map(filename -> filename.toString())
.collect(Collectors.toList());
}
private Stream
getStream(Path dir)
{
if (Files.exists(dir)) {
try {
Stream stream = Files.walk(dir, 1);
return stream
.filter(Files::isRegularFile)
.map(dir::relativize);
} catch (IOException e) {
System.out.println("Error");
}
}
return null;
}
}
Код: Выделить всё
public class Main {
public static void main(String[] args) {
Path dir = Paths.get("C:\\Projects\\Tests\\Walk");
StreamTest streamTest = new StreamTest();
List list = streamTest.getList(dir);
System.out.println(list);
}
}
Но когда я заменяю:
Код: Выделить всё
try {
Stream
stream = Files.walk(dir, 1);
Код: Выделить всё
try (Stream
stream = Files.walk(dir, 1)) {
Код: Выделить всё
Exception in thread "main" java.lang.IllegalStateException
at java.base/java.nio.file.FileTreeIterator.hasNext(FileTreeIterator.java:102)
at java.base/java.util.Iterator.forEachRemaining(Iterator.java:132)
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at com.pl.spetech.StreamTest.getList(StreamTest.java:16)
at com.pl.spetech.Main.main(Main.java:14)
А вообще этот подход правильный? Я имею в виду получение потока из метода и работу над ним? Но как правильно использовать try-with-resources в такой ситуации?
Обходной путь заключается в том, чтобы вернуть список некоторого сопоставленного типа (например, String) вместо Stream из getStream и работать с ним в getList. метод, но мне интересно, есть ли хороший ответ на заданный вопрос.
Конечно, я могу выполнить всю работу одним методом, но гипотетически я могу вызвать getStream из нескольких других методов.
Подробнее здесь: https://stackoverflow.com/questions/790 ... alk-stream