Поток Java Files.walkJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Поток Java Files.walk

Сообщение Anonymous »

Работая над проектом, я столкнулся с ситуацией, которую не знаю, как правильно решить. Я не уверен, что мое решение является лучшим, которое я мог бы использовать. Но позвольте мне представить проблему (я воспроизвел ее настолько просто, насколько мог).
Существует класс (который написан неправильно), который просто извлекает имена файлов из каталога:

Код: Выделить всё

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;
}
}
и Main.class

Код: Выделить всё

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);
}
}
Это работает, но понимаете, в чем проблема? Files.walk(dir, 1) следует запускать с помощью try-with-resources.
Но когда я заменяю:

Код: Выделить всё

try {
Stream
 stream = Files.walk(dir, 1);
с

Код: Выделить всё

try (Stream
 stream = Files.walk(dir, 1)) {

Я получаю IllegalStateException.

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»