解决 bufferedinputstream 转换速度低的问题
为了提升 bufferedinputstream 的转换速度,需要解决以下几个问题:
- 耗时内存等待:原始代码在读取完 http 数据后,将其全部放在内存中,等待耗时。应对方法是使用边读边写的流。
- 阻塞读取:读取数据时,响应一直处于等待状态。解决方案是使用非阻塞读取,例如 nio。
- 未复用连接:http 请求连接未复用。建议使用 okhttp 等库复用连接。
- 资源未释放:响应会等待超时,并且内存会泄露。必须在使用后释放资源。
解决方案:
方案 1:原始流复制
优化原始代码的复制流方法,使用更大的缓冲区来提高效率。
while ((len = bis.read(buffer)) != -1) { out.write(buffer, 0, len); out.flush(); }
方案 2:使用流复制工具类
使用三方库中的流复制工具类,简化代码并提高效率。
ioutil.copy(bis, out);
方案 3:使用 nio 非阻塞传输
使用 nio 非阻塞传输,可以实现更快的流传输。
while (in.read(byteBuffer) != -1) { // 写转读 byteBuffer.flip(); out.write(byteBuffer); byteBuffer.clear(); }