繁体   English   中英

无法使用 InputStream 读取 API 读取所有字节?

[英]Unable to read all bytes using InputStream read API?

我在 java 套接字中读取图像字节时遇到问题。 我的 iOS 客户端在这里发送图像,它需要读取总字节数并将其作为图像存储在服务器端。 当我通过 iOS 模拟器测试时,它工作得很好 因为,如果我在模拟器中测试,它会将图像发送到46,577 bytes 它读取所有内容非常快速和正确。 如果我测试从 iPhone 设备发送图像的相同代码,它也会发送大约“ 45, 301 字节”,但套接字代码只能读取一些“ 21, 720 字节”,所以只有一半的图像即将到来,(或)有时它仅在“ 4,000 字节”左右读取很少。

我不明白为什么它不能只读取来自设备的相同大小的数据? 有人可以指导我解决这个问题吗?

InputStream input = socket.getInputStream();

            byte[] data = new byte[0];
            byte[] buffer = new byte[1024];             

            try {
                do {
                bytesRead = input.read(buffer);
                System.out.println("Reading..bytesRead: " + bytesRead);

                // construct an array large enough to hold the data we currently have
                byte[] newData = new byte[data.length + bytesRead];
                // copy data that was previously read into newData
                System.arraycopy(data, 0, newData, 0, data.length);
                // append new data from buffer into newData
                System.arraycopy(buffer, 0, newData, data.length, bytesRead);
                // set data equal to newData in prep for next block of data
                data = newData;

                } while (input.available() != 0);
            } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            }

            System.out.println("data: " + data.length);

您正在滥用available() 不能作为流结束的测试。 请参阅Javadoc。

您也不需要所有的阵列复制。 尝试这个:

ByteArrayOutputStream out = new ByteArrayOutputStream();
while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}
byte[] data = out.toByteArray();

如果要在接收端存储图像,则应直接写到FileOutputStream而不是上面的ByteArrayOutputStream ,然后完全ByteArrayOutputStream data

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM