【发布时间】:2015-04-28 14:53:54
【问题描述】:
假设我们在两个设备(A 和 B)之间有一个套接字连接。现在,如果我只将 16 个字节(大小在这里无关紧要)写入 A 侧套接字的输出流(不是 BufferedOutputStream)3 次或通常不止一次,如下所示:
OutputStream outputStream = socket.getOutputStream();
byte[] buffer = new byte[16];
OutputStream.write(buffer);
OutputStream.write(buffer);
OutputStream.write(buffer);
我使用套接字输入流(不是 BufferedInputStream)读取 B 侧的数据,其缓冲区大于发送缓冲区,例如 1024:
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int read = inputStream.read(buffer);
现在我想知道 B 方如何接收数据?它可能会累积还是在 A 发送数据时准确读取数据?换句话说,read 变量可能会超过 16?
【问题讨论】:
-
这一切都取决于时间。如果 B 在尝试读取时已接收到所有输入,则它将读取所有 16*3 字节。但如果到那时只发送了其中的一两个,它只会读取那些。
-
如果在发送前开始读取呢? @乔恩
-
@Ali:此方法阻塞,直到输入数据可用、检测到文件结尾或抛出异常。
-
@Ali 我建议阅读 Oracle Tutorial on I/O Streams 以更好地了解它们在内部的实际工作方式。