我正在尝试使用以下代码从网络套接字读取一些数据 -
Socket s = new Socket(address, 502);
response = new byte[1024];
InputStream is = s.getInputStream();
int count = is.read(response, 0, 100);
数据量不大。总共16个字节。然而 read() 语句并不能一次性读取所有数据。它只将 8 个字节的数据读入我的缓冲区。
我必须像这样多次调用 read() 才能读取数据 -
Socket s = new Socket(address, 502);
response = new byte[1024];
InputStream is = s.getInputStream();
int count = is.read(response, 0, 100);
count += is.read(response, count, 100-count);
为什么会发生这种情况?为什么 read() 不能一次性读取整个流?
请注意,数据并不是逐渐到达的。如果我在通过调用 Thread.sleep(2000) 读取数据之前等待 2 秒,则行为保持不变。
最佳答案
Why does read() not read the entire stream in one go?
因为没有指定这样做。请参阅 Javadoc。它会阻塞,直到至少有一个字节可用,然后返回 1 和提供的长度(含)之间的某个数字。
这是因为数据不一定一次性到达。您无法控制 TCP 如何发送和接收数据。您必须将其视为字节流。
关于java - 为什么输入流以 block 的形式读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12090018/