You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2024/07/09 14:32:37 UTC
(commons-io) 02/03: ReaderInputStream.available() should return 0 after the stream is closed
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 <ga...@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 {