flush()方法指示流实际将输出发送到流管道。
出于各种性能原因,各种流实现可以缓存输出,而不是立即写入底层流。
例如,将IO操作保存在磁盘上,这从性能的角度来看是很昂贵的。
刷新流没有问题,即使不是为了性能,在这种情况下,这也是您想要的:在刷新之前,流似乎一直被卡住,因此您希望它实际上将内容发送给客户端。
也许您可以使用大于1024的缓冲区大小来查看更合适的缓冲区。
编辑:
循环冲洗或不循环冲洗的问题相对无关紧要。
您可以随时调用flush,因为它会调用底层OS流,无论这是否影响性能取决于情况。
例如,您可以评估200MB的RAM,其中流在其中缓冲文件比IO操作更重要(从性能角度而言)。
或者更简单地看重用户体验,即如果设法进行衡量,则看到文件实际下载比最终可能会遇到的性能问题更为重要。
如前所述,缓冲区越大,循环问题就越少。举个极端的例子,假设您的缓冲区为100兆字节,那么一个80兆字节的文件将仅获得一次刷新,无论如何它都将在请求结束时获得。
1k的缓冲区可能太小,4k更好,16k很好,这是IO调用和RAM消耗之间的权衡。
流应该自行完成其正常工作,但是,如果您看到200MB的文件已完全缓存,除非您调用flush,那么显然,该流可能正在优化性能,但带来了糟糕的用户体验,因此显然您需要在循环中使用它。



