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 2019/08/10 21:07:15 UTC

[commons-io] branch master updated: Use getChars method for String, StringBuilder and StringBuffer in CharSequenceReader.read(char[], int, int) (#90)

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 c126bdd  Use getChars method for String, StringBuilder and StringBuffer in CharSequenceReader.read(char[], int, int) (#90)
c126bdd is described below

commit c126bdd5161a103cdd4718552d92e2b9153df70b
Author: Rob Spoor <ro...@users.noreply.github.com>
AuthorDate: Sat Aug 10 23:07:10 2019 +0200

    Use getChars method for String, StringBuilder and StringBuffer in CharSequenceReader.read(char[], int, int) (#90)
---
 .../commons/io/input/CharSequenceReader.java       | 20 ++++++++++++++
 .../commons/io/input/CharSequenceReaderTest.java   | 31 +++++++++++++++++++---
 2 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/src/main/java/org/apache/commons/io/input/CharSequenceReader.java b/src/main/java/org/apache/commons/io/input/CharSequenceReader.java
index ea3bb28..36a38ed 100644
--- a/src/main/java/org/apache/commons/io/input/CharSequenceReader.java
+++ b/src/main/java/org/apache/commons/io/input/CharSequenceReader.java
@@ -109,6 +109,26 @@ public class CharSequenceReader extends Reader implements Serializable {
             throw new IndexOutOfBoundsException("Array Size=" + array.length +
                     ", offset=" + offset + ", length=" + length);
         }
+
+        if (charSequence instanceof String) {
+            int count = Math.min(length, charSequence.length() - idx);
+            ((String) charSequence).getChars(idx, idx + count, array, offset);
+            idx += count;
+            return count;
+        }
+        if (charSequence instanceof StringBuilder) {
+            int count = Math.min(length, charSequence.length() - idx);
+            ((StringBuilder) charSequence).getChars(idx, idx + count, array, offset);
+            idx += count;
+            return count;
+        }
+        if (charSequence instanceof StringBuffer) {
+            int count = Math.min(length, charSequence.length() - idx);
+            ((StringBuffer) charSequence).getChars(idx, idx + count, array, offset);
+            idx += count;
+            return count;
+        }
+
         int count = 0;
         for (int i = 0; i < length; i++) {
             final int c = read();
diff --git a/src/test/java/org/apache/commons/io/input/CharSequenceReaderTest.java b/src/test/java/org/apache/commons/io/input/CharSequenceReaderTest.java
index d306293..a245a9b 100644
--- a/src/test/java/org/apache/commons/io/input/CharSequenceReaderTest.java
+++ b/src/test/java/org/apache/commons/io/input/CharSequenceReaderTest.java
@@ -21,6 +21,7 @@ import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
 import java.io.Reader;
+import java.nio.CharBuffer;
 
 import org.junit.Test;
 
@@ -78,7 +79,15 @@ public class CharSequenceReaderTest {
 
     @Test
     public void testRead() throws IOException {
-        try (final Reader reader = new CharSequenceReader("Foo")) {
+        final String value = "Foo";
+        testRead(value);
+        testRead(new StringBuilder(value));
+        testRead(new StringBuffer(value));
+        testRead(CharBuffer.wrap(value));
+    }
+
+    private void testRead(final CharSequence charSequence) throws IOException {
+        try (final Reader reader = new CharSequenceReader(charSequence)) {
             assertEquals('F', reader.read());
             assertEquals('o', reader.read());
             assertEquals('o', reader.read());
@@ -89,7 +98,15 @@ public class CharSequenceReaderTest {
 
     @Test
     public void testReadCharArray() throws IOException {
-        try (final Reader reader = new CharSequenceReader("FooBar")) {
+        final String value = "FooBar";
+        testReadCharArray(value);
+        testReadCharArray(new StringBuilder(value));
+        testReadCharArray(new StringBuffer(value));
+        testReadCharArray(CharBuffer.wrap(value));
+    }
+
+    private void testReadCharArray(final CharSequence charSequence) throws IOException {
+        try (final Reader reader = new CharSequenceReader(charSequence)) {
             char[] chars = new char[2];
             assertEquals(2, reader.read(chars));
             checkArray(new char[] { 'F', 'o' }, chars);
@@ -105,8 +122,16 @@ public class CharSequenceReaderTest {
 
     @Test
     public void testReadCharArrayPortion() throws IOException {
+        final String value = "FooBar";
+        testReadCharArrayPortion(value);
+        testReadCharArrayPortion(new StringBuilder(value));
+        testReadCharArrayPortion(new StringBuffer(value));
+        testReadCharArrayPortion(CharBuffer.wrap(value));
+    }
+
+    private void testReadCharArrayPortion(final CharSequence charSequence) throws IOException {
         final char[] chars = new char[10];
-        try (final Reader reader = new CharSequenceReader("FooBar")) {
+        try (final Reader reader = new CharSequenceReader(charSequence)) {
             assertEquals(3, reader.read(chars, 3, 3));
             checkArray(new char[] { NONE, NONE, NONE, 'F', 'o', 'o' }, chars);
             assertEquals(3, reader.read(chars, 0, 3));