原本出问题的代码是这样的
byte [] getPicByte(String address){
InputStream is = null
HttpURLConnection con = null
try {
URL url = new URL(address)
// 打开连接
con = (HttpURLConnection)url.openConnection()
// 输入流
is = con.getInputStream()
byte [] bytes = new byte[is.available()]
is.read(bytes)
return bytes
} catch (Exception e) {
LoggingUtils.log(ErrorLog.of(e))
return null
}finally {
if(is){
is.close()
}
if(con){
con.disconnect()
}
}
}
咋看之下似乎感觉没问题呀,后来查阅了相关资料才明白问题所在
HttpURLConnection
,在网络不稳定的情况下,is.available()
的值不一定是全部的数据长度,因为网络问题可能数据会多批次发送.所以这里用is.available()
想省力一次性获取全部的数据时有问题的.
如果是本地的图片文件,那么用这种方式还是没问题的.但是网络图片就不能这样了.
解决办法
当流的字符不为-1
时继续读
byte [] getPicByte(String address){
InputStream is = null
HttpURLConnection con = null
ByteArrayOutputStream byteArrayOutputStream = null
try {
URL url = new URL(address)
// 打开连接
con = (HttpURLConnection)url.openConnection()
// 输入流
is = con.getInputStream()
//byte [] bytes = new byte[is.available()]
byte [] bytes = new byte[102400]
int index = 0
byteArrayOutputStream = new ByteArrayOutputStream()
while (-1 != (index = is.read(bytes,0,bytes.length))){
byteArrayOutputStream.write(bytes,0,index)
}
//is.read(bytes)
byte [] resultBytes = byteArrayOutputStream.toByteArray()
return resultBytes
} catch (Exception e) {
LoggingUtils.log(ErrorLog.of(e))
return null
}finally {
if(is){
is.close()
}
if(con){
con.disconnect()
}
if(byteArrayOutputStream){
byteArrayOutputStream.flush()
byteArrayOutputStream.close()
}
}
}