程序挂起在while循环中,用于从socket读取输入流:Java

时间:2014-07-07 20:21:06

标签: java sockets inputstream hang

我有以下代码从套接字连接中读取输入流:

private ByteBuffer toByteBuffer(BufferedInputStream is) throws IOException {
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    int l;
    byte[] data = new byte[256];
    while ((l = is.read(data, 0, data.length)) != -1) {
        buffer.write(data, 0, l);
    }
    buffer.flush();
    return ByteBuffer.wrap(buffer.toByteArray());
}

在while循环的第一次迭代中,一切都很顺利,我可以将数据放入缓冲区。但后来它被卡在while ((l = is.read(data, 0, data.length)) != -1) {

我认为(我可能错了)这是因为它正在等待来自套接字的更多数据,这是永远不会发生的。

如何处理这种情况/挂起?

1 个答案:

答案 0 :(得分:3)

由于你使用的BufferedInputStream方法没有阻止你得到这样的情况,即只要你的InputStream没有任何数据且没有关闭,你就不会得到-1但是0。 这会将您的方法发送到无限循环中。

因此,为了阅读本地流,最好检查read() <= 0,因为您通常可以足够快地获取数据。
最好的方法是通过关闭来确保有eof流。