aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorGary Gregory <garydgregory@gmail.com>2022-10-09 13:25:25 -0400
committerGary Gregory <garydgregory@gmail.com>2022-10-09 13:25:25 -0400
commit7b13b4db7cec3fbf0709df90e51404345b7ad07e (patch)
treecb0d7ac6c8a394364a71b793b61ae33166bff605 /src/main/java/org
parent8b13282c2449a885ba6f9413746a59cc42900c7f (diff)
downloadapache-commons-io-7b13b4db7cec3fbf0709df90e51404345b7ad07e.tar.gz
[IO-782] SequenceReader should close readers when its close method is
called #391.
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/apache/commons/io/input/SequenceReader.java39
1 files changed, 29 insertions, 10 deletions
diff --git a/src/main/java/org/apache/commons/io/input/SequenceReader.java b/src/main/java/org/apache/commons/io/input/SequenceReader.java
index 9da0c3d7..514569d7 100644
--- a/src/main/java/org/apache/commons/io/input/SequenceReader.java
+++ b/src/main/java/org/apache/commons/io/input/SequenceReader.java
@@ -20,19 +20,24 @@ import static org.apache.commons.io.IOUtils.EOF;
import java.io.IOException;
import java.io.Reader;
+import java.io.SequenceInputStream;
+import java.io.UncheckedIOException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Objects;
/**
- * Provides the contents of multiple Readers in sequence.
+ * Provides the contents of multiple {@link Reader}s in sequence.
+ * <p>
+ * Like {@link SequenceInputStream} but for {@link Reader} arguments.
+ * </p>
*
* @since 2.7
*/
public class SequenceReader extends Reader {
private Reader reader;
- private Iterator<? extends Reader> readers;
+ private final Iterator<? extends Reader> readers;
/**
* Constructs a new instance with readers
@@ -41,7 +46,11 @@ public class SequenceReader extends Reader {
*/
public SequenceReader(final Iterable<? extends Reader> readers) {
this.readers = Objects.requireNonNull(readers, "readers").iterator();
- this.reader = nextReader();
+ try {
+ this.reader = nextReader();
+ } catch (final IOException e) {
+ throw new UncheckedIOException(e);
+ }
}
/**
@@ -60,17 +69,27 @@ public class SequenceReader extends Reader {
*/
@Override
public void close() throws IOException {
- this.readers = null;
- this.reader = null;
+ do { // NOPMD
+ // empty
+ } while (nextReader() != null);
}
/**
* Returns the next available reader or null if done.
*
- * @return the next available reader or null
+ * @return the next available reader or null.
+ * @throws IOException IOException If an I/O error occurs.
*/
- private Reader nextReader() {
- return this.readers.hasNext() ? this.readers.next() : null;
+ private Reader nextReader() throws IOException {
+ if (reader != null) {
+ reader.close();
+ }
+ if (readers.hasNext()) {
+ reader = readers.next();
+ } else {
+ reader = null;
+ }
+ return reader;
}
/*
@@ -86,7 +105,7 @@ public class SequenceReader extends Reader {
if (c != EOF) {
break;
}
- reader = nextReader();
+ nextReader();
}
return c;
}
@@ -106,7 +125,7 @@ public class SequenceReader extends Reader {
while (reader != null) {
final int readLen = reader.read(cbuf, off, len);
if (readLen == EOF) {
- reader = nextReader();
+ nextReader();
} else {
count += readLen;
off += readLen;