【问题标题】:Cannot cast from Byte to byte[] java无法从字节转换为字节 [] java
【发布时间】:2014-02-02 12:06:08
【问题描述】:

我正在尝试将字节数组转换为 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();
        }

我该如何解决这个问题?

【问题讨论】:

  • ArrayList<Byte> 包含什么类型的值?
  • 我想将图像从我的 wcf ksoap2 服务传输到 android。所以我已经将图像转换为字节数组并传递给 android。这里 ArrayList 包含所有字节数组。这里我想将字节数组转换为图像
  • 字节[] 字节 = 新字节[arrays.size()]; arrays.toArray(byte);

标签: java android arrays arraylist


【解决方案1】:

您必须将您的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();

【讨论】:

    【解决方案2】:

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

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

    此方法使用本机方法System.arrayCopy。它比遍历整个 ArrayList 快得多。

    【讨论】:

      【解决方案3】:

      如果您不能使用 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;
          }
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          据我了解,您正在尝试将图像从肥皂服务获取到您的 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;
                  }
              }
          

          然后将该字符串转换为字节[]

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

          解码对于重构从服务发送的相同字节[]很重要。

          【讨论】:

            【解决方案6】:

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

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

            并用您的数据填充它。

            【讨论】:

            • 第一个示例甚至不是正确的 Java,您尝试做的事情对于原始数组是不可能的。
            【解决方案7】:

            ArrayList&lt;Byte&gt; arrays; 不包含“字节[]”列表。它是装箱的 Byte 对象的单个列表。

            您需要手动进行转换:

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

            当 Byte 放入数组时,循环会为您将 Byte 拆箱为一个字节。

            【讨论】:

            • array.length 在 for 循环声明中无法编译,需要为 arrays.length() 或 byteArray.length。
            • OP 还表示他有一个 ArrayList 数组,所以我认为您的解决方案应该反映这一点。
            • OP也表示它是一个ArrayList
            • @arne.jans 谢谢,我重命名了 byteArray 但忘记在循环中重命名它。 OP 可能在他的帖子 ArrayList of arrays 中说过,但这不是他在代码中所说的类型,所以我认为他更有可能误解了这一点。
            【解决方案8】:

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

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

            • 网址
            • 文件
            • 输入流

            如果您有要加载的文件 - 只需像这样传递它:

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

            如果它在您的应用程序中,或者像这样:

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

            如果您从外部来源以字节形式获取数据 - 尝试使用 byte[] 而不是 List&lt;Byte&gt;,我假设您正在使用它,因为它更适合您要解决的问题。

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

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

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

            【讨论】:

            • 我想将图像从我的 wcf ksoap2 服务传输到 android。所以我已将图像转换为字节数组并传递给 android。这里 ArrayList 包含所有字节数组。在这里我想将字节数组转换为图像
            • 所以你从某个服务中读取了一个字节[],然后你把它转换成一个 ArrayList,然后你想把它转换回字节[]?
            • 如果我理解正确 - 您从 SOAP API 获取图像作为字符串,可能是 Base64 编码 - 我说的对吗?如果是这样,您可以将 Base64 编码字符串转换为 byte[] 并使用它
            • 我从我的服务中填充了 ArrayList,它包含字节数组形式的转换图像。现在我想将它们转换回图像
            • 如果您别无选择,只能获得 ArrayList&lt;Byte&gt;,请按照 TimB 的回答将其转换为 byte[] - stackoverflow.com/a/21113724/357360
            【解决方案9】:

            错误发生在第3行

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

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

            【讨论】:

            • 它返回 Byte,而不是 byte,这几乎就是 OP 在问题中所说的。
            • @Keppil 感谢您的更正。异常的原因仍然是演员表。
            • 是的,这在异常本身中已明确说明。 OP正在询问如何解决它。
            【解决方案10】:

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

            【讨论】:

            • 如果我理解正确,用户将获得一个数组列表作为输入。此修复在实践中可能站不住脚。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-06-24
            • 1970-01-01
            • 2010-10-15
            • 2016-10-28
            • 1970-01-01
            • 2016-06-01
            • 1970-01-01
            相关资源
            最近更新 更多