没有取之不尽,用之不竭的资源。server有限的带宽。运营商可以限制一点点。近期使用云存储openstack swift待办事项文件存储下载。如果第一个限速code:
private Long writeResponse(HttpServletResponse response,InputStream stream, Long speed, Long startTime, MessageDigest md5) { byte[] b = null; b = new byte[SwiftFileDownload.Download_Read_Unit]; try { OutputStream os = null; os = response.getOutputStream(); long count = 0; int j; while ((j = stream.read(b)) != -1) { if (count + j > speed) { int need = (int) (speed - count); // 剩下的数 int left = (int) (j + count - speed); byte[] temp = new byte[need]; byte[] leftTemp = new byte[left]; System.arraycopy(b, 0, temp, 0, need); System.arraycopy(b, need, leftTemp, 0, left); os.write(temp); md5.update(temp); os.flush(); long endTime = System.currentTimeMillis(); long sleepTime = startTime + 1000 - endTime; if (sleepTime > 0) { Thread.sleep(sleepTime); } startTime = System.currentTimeMillis(); count = 0; os.write(leftTemp); md5.update(leftTemp); os.flush(); count += left; continue; } if (count + j < speed) { count += j; byte[] temp = new byte[j]; System.arraycopy(b, 0, temp, 0, j); os.write(temp); md5.update(b); os.flush(); continue; } if (count + j == speed) { byte[] temp = new byte[j]; System.arraycopy(b, 0, temp, 0, j); os.write(temp); md5.update(b); os.flush(); long endTime = System.currentTimeMillis(); long sleepTime = startTime + 1000 - endTime; if (sleepTime > 0) { Thread.sleep(sleepTime); } // 重置计数器 startTime = System.currentTimeMillis(); count = 0; continue; } } } catch (IOException e1) { log.warn("writeResponse() - response=" + response + ", IOException",e1); throw new BusinessSwiftException(e1); } catch (InterruptedException e) { log.warn("writeResponse() - response=" + response + ", IOException",e); throw new BusinessSwiftException(e); } finally { try { stream.close(); } catch (IOException e) { log.warn("writeResponse() - 关闭swift对象流出错", e); throw new BusinessSwiftException(e); } } return startTime; }
基本的思想:一段时细胞内写入数据流。暂停1其次减去所有的时间进行读写操作。在发现10%左右浮动。
版权声明:本文博主原创文章,博客,未经同意不得转载。