Index: src/main/java/java/io/InputStreamReader.java =================================================================== --- src/main/java/java/io/InputStreamReader.java (revision 545240) +++ src/main/java/java/io/InputStreamReader.java (working copy) @@ -385,31 +385,24 @@ if (length == 0) { return 0; } - - // allocate enough space for bytes if the default length is - // inadequate - int availableLen = in.available(); - if (Math.min(availableLen, length) > bytes.capacity()) { - bytes = ByteBuffer.allocate(availableLen); - } - + CharBuffer out = CharBuffer.wrap(buf, offset, length); CoderResult result = CoderResult.UNDERFLOW; byte[] a = bytes.array(); - boolean has_been_read = false; if (!bytes.hasRemaining() || bytes.limit() == bytes.capacity()) { // Nothing is available in the buffer... if (!bytes.hasRemaining()) { bytes.clear(); } - int readed = in.read(a, bytes.arrayOffset(), bytes.remaining()); + int readed = in.read(a, bytes.arrayOffset() + bytes.position(), + bytes.remaining()); if (readed == -1) { endOfInput = true; return -1; } - bytes.limit(readed); - has_been_read = true; + bytes.limit(bytes.position() + readed); + bytes.position(0); } while (out.hasRemaining()) { @@ -427,9 +420,11 @@ } } if (in.available() > 0 - && (!has_been_read && out.hasRemaining()) + && out.hasRemaining() || out.position() == 0) { - bytes.compact(); + if (bytes.position() > 0) { + bytes.compact(); + } int to_read = bytes.remaining(); int off = bytes.arrayOffset() + bytes.position(); @@ -441,7 +436,6 @@ endOfInput = true; break; } - has_been_read = true; if (to_read > 0) { bytes.limit(bytes.position() + to_read); bytes.position(0);