今天在排查一个问题的时候,发现部分网络环境不支持range,这样就会导致在分段下载的时候,必须用skip()方法,但是按照官方提供的API的说法,skip方法是不能保证一定能够过滤相应的字节数。
解决方案:
private long skipBytesFromStream(InputStream inputStream, long n) {
long remaining = n;
// SKIP_BUFFER_SIZE is used to determine the size of skipBuffer
int SKIP_BUFFER_SIZE = 2048;
// skipBuffer is initialized in skip(long), if needed.
byte[] skipBuffer = null;
int nr = 0;
if (skipBuffer == null) {
skipBuffer = new byte[SKIP_BUFFER_SIZE];
}
byte[] localSkipBuffer = skipBuffer;
if (n <= 0) {
return 0;
}
while (remaining > 0) {
try {
if (inputStream != null) {
nr = inputStream.read(localSkipBuffer, 0,
(int) Math.min(SKIP_BUFFER_SIZE, remaining));
} else {
nr = -1;
}
} catch (IOException e) {
e.printStackTrace();
}
if (nr < 0) {
break;
}
remaining -= nr;
}
return n - remaining;
}
遗留的问题:
由于这样非常耗网络的性能,因为这是逐个字节的从头到尾的读取数据。