4

我已经实现了一个应用程序,它使用 SP 相机拍照并通过套接字将其发送到服务器。

我正在使用以下代码读取本地存储的图像文件并通过套接字将其以连续的块形式发送:

FileInputStream fileInputStream = new FileInputStream( "my_image_file_path" );
ByteArrayOutputStream buffer = new ByteArrayOutputStream();

int nRead;
byte[] data = new byte[16384];

try {
    while( (nRead = fileInputStream.read(data, 0, data.length)) != -1 ){
        buffer.write(data, 0, nRead);
        networkOutputStream.write( buffer.toByteArray() );
        buffer.flush();
    }
} catch( IOException e ){
    e.printStackTrace();
}

我面临的问题是更改字节数组的大小data[]会影响实际发送到服务器的图像量

下面发布的图片应该可以帮助您理解:

  • byte[] data = new byte[16384];

在此处输入图像描述

  • byte[] data = new byte[32768];

在此处输入图像描述

  • byte[] data = new byte[65536];

在此处输入图像描述

等等。

正如您可以想象的那样,我可以找到一个允许我发送完整图像的尺寸,但是这种临时解决方案是不可接受的,因为可能需要发送任何尺寸的图像。

在我看来,我以缓冲方式读取图像文件的方式似乎存在问题,您能帮帮我吗?

提前致谢!

4

1 回答 1

5

ByteArrayOutputStream 的使用是多余的,每次它增长时你都在发送它的全部内容。改变你的循环如下:

FileInputStream fileInputStream = new FileInputStream( "my_image_file_path" );

int nRead;
byte[] data = new byte[16384];

try {
    while( (nRead = fileInputStream.read(data)) != -1 ){
        networkOutputStream.write( data, 0, nRead );
    }

} catch( IOException e ){
    e.printStackTrace();
}
fileInputStream.close();
于 2012-08-21T16:16:38.560 回答