如果服务器使用Chunked TransferEncoding,你将无法预先确定大小。 答复是分门别类的,你只得分配一个缓冲,储存图像,直至上游完成。 请注意,只有你能够保证图像足够小,足以保存记忆,你才能这样做。 如果图像可能大,简化对闪电储存的反应是完全合理的选择。
In-memory solution:
private static final int READ_SIZE = 16384;
byte[] imageBuf;
if (-1 == contentLength) {
byte[] buf = new byte[READ_SIZE];
int bufferLeft = buf.length;
int offset = 0;
int result = 0;
outer: do {
while (bufferLeft > 0) {
result = is.read(buf, offset, bufferLeft);
if (result < 0) {
// we re done
break outer;
}
offset += result;
bufferLeft -= result;
}
// resize
bufferLeft = READ_SIZE;
int newSize = buf.length + READ_SIZE;
byte[] newBuf = new byte[newSize];
System.arraycopy(buf, 0, newBuf, 0, buf.length);
buf = newBuf;
} while (true);
imageBuf = new byte[offset];
System.arraycopy(buf, 0, imageBuf, 0, offset);
} else { // download using the simple method
从理论上讲,如果Http客户将自己列为HTTP 1.0,大多数服务器将转而采用非主流模式,但我并不认为这是URLConnection的一种可能性。