gpt4 book ai didi

java - InputStream 的 available() 趋于停止

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:53:39 25 4
gpt4 key购买 nike

这是一个有点晦涩的问题,似乎只在我使用某些计算机时才会发生。我今天在我们学校的 XP 计算机上遇到了这个问题,我似乎无法在我的家用计算机 (W7) 上复制它。

无论如何,每当我使用这段代码(其中:int avail、InputStream socket、byte[] buffer、String output)时,在 Java 中读取/写入套接字往往会出现问题:

                   while( (avail = input.available()) > 0 )
{
read = input.read( buffer );
output += new String( buffer, 0, read );
}

这似乎是有道理的(读取所有数据直到没有数据可用于临时缓冲区,然后是字符串),但在我们学校的计算机上(使用 IE7 进行测试),整个过程以某种方式暂停。我在想 input.available() 导致它以某种方式阻塞,因为线程一直在运行而没有到达端点......实际上只是在某处暂停。

哦,我忘了提:每当我在 Debug模式下运行它并逐步执行每一行时,它完全按照它应该的方式工作......这让我更加困惑。

当我回到家重现这个问题时,它工作得很好(只使用 Firefox 和 IE8)。我不知道什么是更好的替代方案。

附言:如果缓冲区足够大,我就使用:

                    read = input.read( buffer );
output += new String( buffer, 0, read );

工作正常,但总担心发送的数据会超过缓冲区大小。

最佳答案

您正在以错误的方式考虑 available()。那个方法tells you approximately how many bytes can be read right now ,没有阻塞。对于您要尝试做的事情,普遍接受的成语是

int length;
while ((length = in.read(buffer)) != -1) {
output += new String(buffer, 0, length);
}

或类似的东西(未编译/测试)。

更新:我认为您误解了“流结束”的概念。 “流结束”并不意味着您要读取的所有数据都已读取。这意味着没有,也永远不会有任何其他可读的东西。例如,这可能意味着您正在读取一个文件并已读完,或者它可能意味着您正在从内存中的字节数组中读取并已读完。那些是“流的结尾”。

在您的问题中,您表示或至少暗示您是 reading from a Socket .您是否知道在关联的 Socket 或连接的远程端关闭之前,您永远不会到达该流的末尾?仅仅因为您从中收到了一些数据并不能使它成为流的结尾。

关于java - InputStream 的 available() 趋于停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10694985/

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