我正在尝试将字节数组转换为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();
}
我该如何解决这个问题?
答案 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个不同的输入结合使用:
如果您要加载文件 - 只需将其传递:
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[]>();
并填写您的数据。