【问题标题】:InputStream.available() doesn't workInputStream.available() 不起作用
【发布时间】:2011-02-02 23:33:52
【问题描述】:

我正在尝试使用 inputstream.available() 在不阻塞线程的情况下检查是否有要读取的数据。但它永远不会返回任何 > 0 的值。我用错了吗?

while (slept < logOnTimeOut) {
    if ( sslSocket.getInputStream().available() > 0 )  {
        if (input.readLine().equals("OK") ) {    // todo: set timeout here
            System.out.println("Successfully Logged On");
            isLoggedOn = true;
            return true;
        }
    } else {
        Thread.sleep(500);
        slept += 500;
    }
}

【问题讨论】:

    标签: java inputstream


    【解决方案1】:

    阅读javadoc

    返回对可以从此输入流读取(或跳过)的字节数的估计值,而不会被下一次为此输入流的方法调用阻塞。下一次调用可能是同一个线程或另一个线程。单次读取或跳过这么多字节不会阻塞,但可能会读取或跳过更少的字节。

    请注意,虽然 InputStream 的某些实现会返回流中的总字节数,但很多不会。使用这个方法的返回值来分配一个缓冲区来保存这个流中的所有数据是不正确的

    简而言之,InputStream.available() 并没有你想象的那么有用。

    如果你需要检测流的结尾,read() 会检测结果是否为-1。不要使用available()

    【讨论】:

    • 但是 read() 总是会阻塞线程对吧?如何在不阻塞的情况下进行检查?
    • @Leon:你不能,InputStream 不行。如果你想要非阻塞 I/O,你需要使用java.nio 中的东西。
    • 我的最后一个问题是,以下2个1对多连接的解决方案,哪个更好? 1. 使用 nio 2. 使用新线程与每个客户端套接字进行通信
    • @Leon:两者都不是更好,它们只是不同。这取决于您的应用程序。如果您需要这方面的建议,请提出一个新问题并详细说明您的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 2011-08-15
    • 1970-01-01
    • 2011-04-11
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多