无法从Byte转换为byte [] java

时间:2014-01-14 12:18:21

标签: java android arrays arraylist

我正在尝试将字节数组转换为android中的图像。 我有一个ArrayList<Byte> arrays;,它包含我想要转换的所有字节数组。 现在在

byt = (byte[]) arrays.get(0); 

它给我Cannot cast from Byte to byte[] java例外。

        byte[] byt;
        byt = new byte[4096];
        byt = (byte[]) arrays.get(0) ;
        BufferedImage bImageFromConvert = null;
        InputStream in = new ByteArrayInputStream(byt);

        try {
            bImageFromConvert = ImageIO.read(in);
            SaveImages();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

我该如何解决这个问题?

10 个答案:

答案 0 :(得分:1)

ArrayList不包含Byte []或byte []值,但是列表本身可以转换为字节数组,因为它包含单个字节值

        byte[] bytes = new byte[array.size()];
        for (int i = 0; i < array.size(); i++) {
            bytes[i] = array.get(i);
        }

答案 1 :(得分:0)

尝试使用ByteArrayOutputStream而不是arraylist,它更好。然后使用ByteArrayOutputStream.toByteArray()。

答案 2 :(得分:0)

ArrayList<Byte> arrays;不包含`Byte []'列表。它是盒装字节对象的单个列表。

您需要手动进行转换:

 byte[] byteArray = new byte[arrays.size()];

 for (int i=0;i<byteArray.length;i++) {
    byteArray[i] = arrays.get(i);
 }

当将字节放入数组时,循环会将字节解包为一个字节。

答案 3 :(得分:0)

你似乎在滥用ImageIO API(如果我误解了,请纠正我):

您可以将ImageIO.read与3个不同的输入结合使用:

  • URL
  • 文件
  • 的InputStream

如果您要加载文件 - 只需将其传递:

bImageFromConvert = ImageIO.read(new File("someFile.jpg"));

如果它在你的申请中,或者像这样:

bImageFromConvert =
   ImageIO.read(this.getClass().getClassloader().getResourceAsStream("com/myapp/images/someFile.jpg"));

如果您从外部来源获取数据作为字节 - 尝试使用byte[]而不是List<Byte>,我认为您正在使用它,因为它更适合您尝试解决的问题

另外,请注意您仅为图像分配了4K - 这可能不足以加载图像 - 这应该导致ImageIO.read失败。

我没有添加任何关于使用URL的内容 - 但我认为这很明显。

如果这不能回答您的问题,请添加更多相关输入。

答案 4 :(得分:0)

据我了解,您正在尝试从soap服务获取图像到您的Android设备。

我建议使用以下方法,

以字符串形式读取SOAP对象属性。

String mPhoto;

 if (soapObject.hasProperty(PHOTO)) {
        Object obj = soapObject.getProperty(PHOTO);
        if (obj != null && obj.getClass().equals(SoapPrimitive.class)) {
            SoapPrimitive j = (SoapPrimitive) obj;
            mPhoto = j.toString();
        } else if (obj != null && obj instanceof String) {
            mPhoto = obj.toString();
        } else {
            mPhoto = null;
        }
    }

然后将该String转换为byte []

public byte[] getPhoto() {
    if (mPhoto != null) {
           // org.kobjects.base64.Base64;
        return Base64.decode(mPhoto);
    } else {
        return null;
    }
}

解码对于重建从服务发送的相同字节[]非常重要。

答案 5 :(得分:0)

如果您无法使用Byte []的其他解决方案。 然后你可以使用Apache Lang库中的ArrayUtils类的toPrimitive方法。 或者使用下面的代码:

public static byte[] toPrimitive(final Byte[] array) {
        if (array == null) {
            return null;
        } else if (array.length == 0) {
            return EMPTY_BYTE_ARRAY;
        }
        final byte[] result = new byte[array.length];
        for (int i = 0; i < array.length; i++) {
            result[i] = array[i].byteValue();
        }
        return result;
    }

答案 6 :(得分:0)

您必须将ArrayList<Byte>声明为ArrayList<byte[]> arrays;

您当前的声明不会存储字节数组列表,而是存储Byte 对象列表,而不是数组。即使您的数组声明为ArrayList<Byte[]> arrays;,也无法将Byte[]数组转换为byte[]数组。 Java不支持直接转换primitive data types及其wrapper types,也不支持它们的数组类型。

基元及其包装类型是盒装非盒装。由于Java 5中引入了auto-(un)boxing功能,编译器以Integer myInt = 0;Integer myInt = Integer.valueOf(0);静默替换int myInt = myWrappedInt;int myInt = myWrappedInt.intValue();等声明。

答案 7 :(得分:0)

您可以使用ArrayList.toArray(T[])方法,如下所示:

Byte[] byteArray = new Byte[arrays.size()];
ArrayList.toArray(byteArray);

此方法使用System.arrayCopy,一种本机方法。它比迭代整个ArrayList要快得多。

答案 8 :(得分:-1)

错误发生在第3行

        byt = (byte[]) arrays.get(0) ;

arrays.get(0)返回一个Byte,然后尝试转换为byte []

答案 9 :(得分:-1)

如果您尝试将字节数组放入ArrayList数组中,则应将其声明更正为:

ArrayList<Byte[]> arrays = new ArrayList<Byte[]>();

并填写您的数据。