套接字InputStream块在available()/ read()上 - java

我正在阅读Socket InputStream,调用read()和available()可以进行几次循环迭代。以后的available()会无限期阻塞!

可能是什么问题?我该如何使它不受阻碍?

码:

BufferedInputStream buffIn = new BufferedInputStream(in);
while (true)
{
    if (buffIn.available() > 0)
    {
        len = buffIn.read(buffer, 0, buffer.length);
        if (len == -1)
        {
            break;
        }
        baos.write(buffer, 0, len);
    }
}

参考方案

它没有阻止它正在旋转。

一旦没有可用的数据,您的代码可能也会读完

while (true)
{
    if (buffIn.available() > 0) // ALWAYS false now we've run out of data
    {
       // unreachable
    }
}

循环将永远不会结束。没有可用数据时,将永远不会执行负1值的测试。

您会在堆栈跟踪中看到available(),因为这是循环中唯一占用任何时间的东西,因此,当您创建堆栈跟踪时,这就是可能的情况。

如果您确信实际上会得到文件结尾条件(例如,如果是TCP,而另一端关闭了连接),则根本不需要available()调用。否则,您需要另一种方法来确定您是否拥有所有数据。例如,有效载荷大小是在前几个字节中编码还是其他?

ImageIO.read()是否考虑了EXIF方向元数据? - java

在JPEG图像中,有时会包含EXIF元数据,并告知应以什么方向显示图像。问题是,Java的ImageIO.read()在读取JPEG图像时是否将EXIF考虑在内,并自动应用转换。更具体地说,如果我使用Java的ImageIO将带有EXIF的JPEG图像转换为PNG图像,PNG图像的方向是否正确?还是下面的代码将在不考虑EXIF方向说明的情况下生成PNG图像?…

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java DefaultSslContextFactory密钥库动态更新 - java

我有一个使用org.restlet.engine.ssl.DefaultSslContextFactory的现有应用程序和一个在服务器启动时加载的密钥库文件。我有另一个应用程序,该应用程序创建必须添加的证书服务器运行时动态地更新到密钥库文件。为此,我在代码中创建了证书和私钥,然后将其写入到目录。该目录由bash脚本监视,该脚本检查是否有新文件,如果出现,它将…