我使用Java 8编写了一个简单的客户端和服务器,以验证使用Zero copy
比使用article的传统方法更有效。但是我遇到了一个问题,在服务器端,方法InputStream.reamd(byte[],int postion,int length)
总是返回length
,即使从InputStream的最后一次读取没有任何数据。
这样的代码;
while (true) {
Socket socket = serverSocket.accept();
inputStream = socket.getInputStream();
byte[] readBuf = new byte[4096];
long sum = 0L;
while (true) {
int readN = inputStream.read(readBuf, 0, 4096);
System.out.println("read from buffer " + readN);
if (-1 == readN) {
break;
}
sum += readN;
}
System.out.println("total receive " + sum + " bytes");
}
最后两个输出是:
read from buffer 4096
read from buffer -1
除了输出是:
read from buffer 3440
read from buffer -1
Java文档说:
public int read(byte [] b, 诠释 int len) 引发IOException
从输入流中读取最多len个字节的数据到一个字节数组中。尝试读取多达len个字节,但可能读取的字节数较小。实际读取的字节数以整数形式返回。
为什么代码的行为与文档不一致?