如何在套接字连接中下载图像并删除不需要的字节

时间:2017-04-19 09:50:28

标签: java android sockets java-io

我需要通过套接字连接下载图像。目前我有一个字节数组,其中包含一个.jpg文件以及一些其他不需要的字节(ffd8)。我需要从字节数组中删除这些不需要的字节。我尝试下载文件而不删除字节然后我得到了损坏格式的图像。所以我想知道如何从我的bytearray中删除不需要的字节。

在我的代码中:

  while (!status) {
                        byte[] buffer = new byte[1024]; // or 4096, or more
                        int bytesRead = input.read(buffer, 0, buffer.length);
                        int availableBytes = input.available();

                        str2 = str2.append(bytesRead);
                        ImageDataArray = concat(ImageDataArray, buffer);
                        countPackets = countPackets + buffer.length;
                        if (input.available() != 0) {
                            System.out.println("String:" + str1.toString());
                        } else break;
                    }
                    System.out.println("--------------------out of while ------------------");
                    File file = new File(Environment.getExternalStorageDirectory().getAbsoluteFile(), "/SteelmanPro/1020/images/image" +filename1);
                    if (!file.exists()) {
                        file.createNewFile();
                    }
                }
                write(ImageDataArray, Environment.getExternalStorageDirectory().getAbsoluteFile() + "/SteelmanPro/1020/images/image" +filename1);

concat()方法:

 public  byte[] concat(byte[]...arrays)
{
    // Determine the length of the result array
    int totalLength = 0;
    for (int i = 0; i < arrays.length; i++)
    {
        totalLength += arrays[i].length;
    }

    // create the result array
    byte[] result = new byte[totalLength];

    // copy the source arrays into the result array
    int currentIndex = 0;
    for (int i = 0; i < arrays.length; i++)
    {
        System.arraycopy(arrays[i], 0, result, currentIndex, arrays[i].length);
        currentIndex += arrays[i].length;
    }

    return result;
}

写方法:

 void write(byte[] aInput, String aOutputFileName) {

    Log.e("dfd", "Writing binary file...");
    try {
        OutputStream output = null;
        try {
            output = new BufferedOutputStream(new FileOutputStream(aOutputFileName));
            output.write(aInput);
        } finally {
            if (output != null)
                output.close();
        }
    } catch (FileNotFoundException ex) {
        Log.e("dfd", "File not found.");
    } catch (IOException ex) {
        Log.e("dfd", "" + ex);
    }
}

2 个答案:

答案 0 :(得分:1)

  

其中包含.jpg文件以及其他一些不需要的字节(ffd8)   我试图下载文件而不删除字节然后我得到了损坏格式的图像

由于删除FFD8会导致您最终损坏,但您仍然会尝试这样做,需要采取哪些措施才能让您停止思考&#34;不需要的&#34;字节实际上是#34;非常想要&#34;? (双关语)

事实上,FF D8 FF是JPEG magic number,是JPEG文件的一部分。

https://en.wikipedia.org/wiki/JPEG

答案 1 :(得分:1)

您的代码充满了错误。

while (!status) {
    byte[] buffer = new byte[1024]; // or 4096, or more

此数组应在循环外部分配。

    int bytesRead = input.read(buffer, 0, buffer.length);
    int availableBytes = input.available();

调用available()通常毫无意义,这也不例外,尤其是因为您并未在任何地方使用availableBytes

     str2 = str2.append(bytesRead);

如果这是一张图片,则不应将其存储在String中。 String不是二进制数据的容器。

        ImageDataArray = concat(ImageDataArray, buffer);

由于您尚未发布ImageDataArray,因此无法知道这意味着什么。

        countPackets = countPackets + buffer.length;

错误。它应该是countPackets + bytesRead。您不能假设read()填充缓冲区。这就是它返回值的原因。

        if (input.available() != 0) {

另一次滥用available()。它不是对流结束或消息结束的测试。

            System.out.println("String:" + str1.toString());
        } else break;
    }
    System.out.println("--------------------out of while ------------------");
    File file = new File(Environment.getExternalStorageDirectory().getAbsoluteFile(), "/SteelmanPro/1020/images/image" +filename1);
     if (!file.exists()) {
         file.createNewFile();
    }

当你即将创建一个名称相同的new FileOutputStream(...)时,这个区块不仅多余而且浪费。

}
write(ImageDataArray, Environment.getExternalStorageDirectory().getAbsoluteFile() + "/SteelmanPro/1020/images/image" +filename1);

由于您尚未发布此write()方法,因此无法对其进行评论。

concat()方法:

public  byte[] concat(byte[]...arrays)

签名已经错了。你不知道这些数组中的任何一个都被填满了。见上文。

{
    // Determine the length of the result array
    int totalLength = 0;
    for (int i = 0; i < arrays.length; i++)
    {
        totalLength += arrays[i].length;
    }

    // create the result array
    byte[] result = new byte[totalLength];

    // copy the source arrays into the result array
    int currentIndex = 0;
    for (int i = 0; i < arrays.length; i++)
    {
        System.arraycopy(arrays[i], 0, result, currentIndex, arrays[i].length);
        currentIndex += arrays[i].length;
    }
    return result;
}

您不需要整个方法。您应该在收到文件时将数据写入文件而不是浪费内存并增加延迟。

不要写这样的代码。