[IO-781] Fix CharSequenceInputStream coding exception handling (#537)
diff --git a/src/main/java/org/apache/commons/io/input/CharSequenceInputStream.java b/src/main/java/org/apache/commons/io/input/CharSequenceInputStream.java
index 5b53f5d..195244e 100644
--- a/src/main/java/org/apache/commons/io/input/CharSequenceInputStream.java
+++ b/src/main/java/org/apache/commons/io/input/CharSequenceInputStream.java
@@ -186,6 +186,7 @@ private CharSequenceInputStream(final CharSequence cs, final int bufferSize, fin
// Reset everything without filling the buffer
// so the same exception can be thrown again later.
this.bBuf.clear();
+ this.bBuf.flip();
this.cBuf.rewind();
}
}
diff --git a/src/test/java/org/apache/commons/io/input/CharSequenceInputStreamTest.java b/src/test/java/org/apache/commons/io/input/CharSequenceInputStreamTest.java
index cbdfc9e..2c2827d 100644
--- a/src/test/java/org/apache/commons/io/input/CharSequenceInputStreamTest.java
+++ b/src/test/java/org/apache/commons/io/input/CharSequenceInputStreamTest.java
@@ -20,6 +20,7 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
@@ -31,7 +32,9 @@
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.nio.charset.CoderResult;
+import java.nio.charset.CodingErrorAction;
import java.nio.charset.StandardCharsets;
+import java.nio.charset.UnmappableCharacterException;
import java.util.Random;
import org.apache.commons.io.CharsetsTest;
@@ -524,4 +527,15 @@ public void testSkip_RequiredCharsets(final String csName) throws Exception {
assertEquals(-1, r.read(), csName);
}
}
+
+ @Test
+ public void testCharacterCodingException() throws IOException {
+ final Charset charset = StandardCharsets.US_ASCII;
+ final CharSequenceInputStream in = CharSequenceInputStream.builder()
+ .setCharsetEncoder(charset.newEncoder().onUnmappableCharacter(CodingErrorAction.REPORT))
+ .setCharSequence("\u0080")
+ .get();
+ assertEquals(0, in.available());
+ assertThrows(UnmappableCharacterException.class, in::read);
+ }
}