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
commit 24511345b0d7708966f971c6e354daf4e447401a Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Mon Jul 8 22:16:52 2024 -0400 ReaderInputStream.available() should return 0 after the stream is closed ReaderInputStream.read() should return -1 (EOF) after the stream is closed --- src/changes/changes.xml | 2 ++ .../apache/commons/io/input/ReaderInputStream.java | 14 +++++++++- .../commons/io/input/ReaderInputStreamTest.java | 31 ++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index ac6667bea..3c4650ad4 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -81,6 +81,8 @@ The <action> type attribute can be add,update,fix,remove. <action dev="ggregory" type="fix" due-to="Gary Gregory">ProxyInputStream.read() should return -1 (EOF) after the stream is closed.</action> <action dev="ggregory" type="fix" due-to="Gary Gregory">RandomAccessFileInputStream.available() should return 0 after the stream is closed.</action> <action dev="ggregory" type="fix" due-to="Gary Gregory">RandomAccessFileInputStream.read() should return -1 (EOF) after the stream is closed.</action> + <action dev="ggregory" type="fix" due-to="Gary Gregory">ReaderInputStream.available() should return 0 after the stream is closed.</action> + <action dev="ggregory" type="fix" due-to="Gary Gregory">ReaderInputStream.read() should return -1 (EOF) after the stream is closed.</action> <!-- UPDATE --> <action dev="ggregory" type="update" due-to="Dependabot">Bump tests commons.bytebuddy.version from 1.14.13 to 1.14.17 #615, #621, #631, #635.</action> <action dev="ggregory" type="update" due-to="Dependabot">Bump tests commons-codec:commons-codec from 1.16.1 to 1.17.0.</action> diff --git a/src/main/java/org/apache/commons/io/input/ReaderInputStream.java b/src/main/java/org/apache/commons/io/input/ReaderInputStream.java index 28e4469f5..0c5177c8d 100644 --- a/src/main/java/org/apache/commons/io/input/ReaderInputStream.java +++ b/src/main/java/org/apache/commons/io/input/ReaderInputStream.java @@ -85,7 +85,7 @@ import org.apache.commons.io.charset.CharsetEncoders; * @see org.apache.commons.io.output.WriterOutputStream * @since 2.0 */ -public class ReaderInputStream extends InputStream { +public class ReaderInputStream extends AbstractInputStream { // @formatter:off /** @@ -338,6 +338,14 @@ public class ReaderInputStream extends InputStream { this(reader, Charsets.toCharset(charsetName), bufferSize); } + @Override + public int available() throws IOException { + if (encoderOut.hasRemaining()) { + return encoderOut.remaining(); + } + return 0; + } + /** * Closes the stream. This method will cause the underlying {@link Reader} to be closed. * @@ -346,6 +354,7 @@ public class ReaderInputStream extends InputStream { @Override public void close() throws IOException { reader.close(); + super.close(); } /** @@ -399,6 +408,9 @@ public class ReaderInputStream extends InputStream { */ @Override public int read() throws IOException { + if (isClosed()) { + return IOUtils.EOF; + } for (;;) { if (encoderOut.hasRemaining()) { return encoderOut.get() & 0xFF; diff --git a/src/test/java/org/apache/commons/io/input/ReaderInputStreamTest.java b/src/test/java/org/apache/commons/io/input/ReaderInputStreamTest.java index 7aaaa3d95..a538edb37 100644 --- a/src/test/java/org/apache/commons/io/input/ReaderInputStreamTest.java +++ b/src/test/java/org/apache/commons/io/input/ReaderInputStreamTest.java @@ -73,6 +73,37 @@ public class ReaderInputStreamTest { private final Random random = new Random(); + private ReaderInputStream createInputStream() throws IOException { + return ReaderInputStream.builder().setReader(new StringReader(TEST_STRING)).get(); + } + + @Test + public void testAvailableAfterClose() throws IOException { + try (InputStream inputStream = createInputStream()) { + inputStream.close(); + assertEquals(0, inputStream.available()); + } + } + + @Test + public void testReasdAfterClose() throws IOException { + try (InputStream inputStream = createInputStream()) { + inputStream.close(); + assertEquals(IOUtils.EOF, inputStream.read()); + } + } + + @Test + public void testAvailableAfterOpen() throws IOException { + try (InputStream inputStream = createInputStream()) { + // Nothing read, may block + assertEquals(0, inputStream.available()); + // Read/block + inputStream.read(); + assertEquals(TEST_STRING.length() - 1, inputStream.available()); + } + } + @Test @Timeout(value = 500, unit = TimeUnit.MILLISECONDS) public void testBufferSmallest() throws IOException {