gpt4 book ai didi

java - 为什么输入流以 block 的形式读取数据?

转载 作者:行者123 更新时间:2023-12-01 21:57:49 24 4
gpt4 key购买 nike

我正在尝试使用以下代码从网络套接字读取一些数据 -

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com