This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-io.git
The following commit(s) were added to refs/heads/master by this push: new 893935ed [IO-811] StreamIterator fails to close its internal Stream 893935ed is described below commit 893935edde49e1c240dac6bb92c1504948ceb4a0 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Mon Oct 2 08:33:50 2023 -0400 [IO-811] StreamIterator fails to close its internal Stream Test PR coming next --- src/changes/changes.xml | 3 +++ src/main/java/org/apache/commons/io/StreamIterator.java | 10 ++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index c3c893bf..b42898b0 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,9 @@ The <action> type attribute can be add,update,fix,remove. <action dev="ggregory" type="fix" issue="IO-811" due-to="Adam Rauch, Gary Gregory"> FileUtils.iterateFiles(File, String[], boolean) fails to close its internal Stream. </action> + <action dev="ggregory" type="fix" issue="IO-811" due-to="Adam Rauch, Gary Gregory"> + StreamIterator fails to close its internal Stream. + </action> </release> <release version="2.14.0" date="2023-09-24" description="Java 8 is required."> <!-- FIX --> diff --git a/src/main/java/org/apache/commons/io/StreamIterator.java b/src/main/java/org/apache/commons/io/StreamIterator.java index eedcf706..0f7e7839 100644 --- a/src/main/java/org/apache/commons/io/StreamIterator.java +++ b/src/main/java/org/apache/commons/io/StreamIterator.java @@ -45,15 +45,16 @@ final class StreamIterator<E> implements Iterator<E>, Closeable { * @param stream The stream iterate. * @return A new iterator. */ - @SuppressWarnings("resource") // Caller MUST close or iterate to the end. public static <T> Iterator<T> iterator(final Stream<T> stream) { - return new StreamIterator<>(stream).iterator; + return new StreamIterator<>(stream); } private final Iterator<E> iterator; private final Stream<E> stream; + private boolean closed; + private StreamIterator(final Stream<E> stream) { this.stream = Objects.requireNonNull(stream, "stream"); this.iterator = stream.iterator(); @@ -64,11 +65,16 @@ final class StreamIterator<E> implements Iterator<E>, Closeable { */ @Override public void close() { + closed = true; stream.close(); } @Override public boolean hasNext() { + if (closed) { + // Calling Iterator#hasNext() on a closed java.nio.file.FileTreeIterator causes an IllegalStateException. + return false; + } final boolean hasNext = iterator.hasNext(); if (!hasNext) { close();