PushbackInputStream的一个小bug

在前面java socket那篇文章中我提到netty使用PushbackInputStream来解决IO阻塞的问题。今天遇到一个错误使用PushbackInputStream导致的小BUG,花费了一点时间,所以记录一下。我的代码:

public void run() {
Socket socket = this.socket;
PushbackInputStream input = null;

while (true) {
try {

input = new PushbackInputStream(socket.getInputStream(), 1);
int bytesToRead = input.available();
byte[] buf;
String buffer;
int readBytes;
if (bytesToRead > 0) {
buf = new byte[bytesToRead];
readBytes = input.read(buf);
} else {
int b = input.read();
if (b < 0) {
break;
}
input.unread(b);
continue;
}

System.out.println(readBytes);
System.out.println(buf.length);
buffer = new String(buf);
String result = t.test(buffer);
OutputStream out = socket.getOutputStream();
out.write(("ok" + result + "\r\n").getBytes());
out.flush();
} catch (Exception e) {
e.printStackTrace();
}

}
try {
System.out.println("colse");
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}


这段代码能运行,但多次调用之后会出现数据丢失的问题,刚好第一个byte丢掉了。原因是我没有理解PushbackInputStream的用法。
new PushbackInputStream(socket.getInputStream(), 1);
这里面的1表示每次只读取一个字节。那么在具体读数据的时候:
int b = input.read();
if (b < 0) {
break;
}
input.unread(b);
continue;

b返回读到的数据,如果大于0表示有新数据进来了,那么我们通过unread返回给inpustream,然后continue。所以回到前面的代码,不应该在while循环里面new PushbackInputStream(),而应该放在while循环外面。

你可能感兴趣的:(java,io,socket)