public static void waitUntil(String prompt, InputStream instr) {
while (true) {
try {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (instr.available() >= 5) {
byte[] buff = new byte[1024];
int ret_read = 0;
ret_read = instr.read(buff);
if (ret_read > 0) {
if ((new String(buff, 0, ret_read)).contains(prompt)
&& flag) {
break;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
如果删除thread.sleep(1000)
或者甚至我将其减少到小于1000就不能正常工作。
问题:如何在没有thread.sleep()
的情况下读取java套接字输入流,直到所有传入的字节到达为止?
答案 0 :(得分:0)
if (instr.available() >= 5) {
不要这样做。
不是检查可用的字节数,而是尝试将一些字节读入缓冲区。
这将阻塞,直到至少有一个字节可用,然后返回尽可能多的字节(也适合缓冲区)。
如果没有返回你需要的所有字节,则循环直到你得到它们。
如果您只想阅读所有内容,请查看以下主题:Convert InputStream to byte array in Java。就个人而言,我使用Commons IO。
答案 1 :(得分:0)
使用缓冲区大小为5的DataInputStream.readFully()
(在这种情况下,或更一般地说是您期望的数据大小),并且摆脱睡眠和available()
测试。< / p>