diff --git a/buffer/src/main/java/io/netty/buffer/ByteBufInputStream.java b/buffer/src/main/java/io/netty/buffer/ByteBufInputStream.java index f99e4c6444..46b11b090c 100644 --- a/buffer/src/main/java/io/netty/buffer/ByteBufInputStream.java +++ b/buffer/src/main/java/io/netty/buffer/ByteBufInputStream.java @@ -186,21 +186,25 @@ public class ByteBufInputStream extends InputStream implements DataInput { @Override public String readLine() throws IOException { lineBuf.setLength(0); - for (;;) { - int b = read(); - if (b == -1 && lineBuf.length() == 0) { - return null; - } - if (b < 0 || b == '\n') { - break; + + loop: while (true) { + if (!buffer.isReadable()) { + return (lineBuf.length() > 0) ? lineBuf.toString() : null; } - lineBuf.append((char) b); - } + int c = buffer.readUnsignedByte(); + switch (c) { + case '\n': + break loop; - if (lineBuf.length() > 0) { - while (lineBuf.charAt(lineBuf.length() - 1) == '\r') { - lineBuf.setLength(lineBuf.length() - 1); + case '\r': + if (buffer.isReadable() && buffer.getUnsignedByte(buffer.readerIndex()) == '\n') { + buffer.skipBytes(1); + } + break loop; + + default: + lineBuf.append((char) c); } } diff --git a/buffer/src/test/java/io/netty/buffer/ByteBufStreamTest.java b/buffer/src/test/java/io/netty/buffer/ByteBufStreamTest.java index 430df8ff5d..7f2d180061 100644 --- a/buffer/src/test/java/io/netty/buffer/ByteBufStreamTest.java +++ b/buffer/src/test/java/io/netty/buffer/ByteBufStreamTest.java @@ -134,6 +134,7 @@ public class ByteBufStreamTest { assertEquals("Hello, World!", in.readUTF()); assertEquals("The first line", in.readLine()); + assertEquals("", in.readLine()); assertEquals(4, in.read(tmp)); assertEquals(1, tmp[0]);