Java NIO Servlet到文件
有没有一种方法(不缓冲整个InputStream)从Java Servlet中获取HttpServletRequest并使用所有NIO将其写入文件? 它甚至值得尝试吗? 它是否能够更快地读取正常的java.io流并写入java.nio Channel?或者它们是否都需要纯粹的NIO才能看到好处? 谢谢。
编辑:
所以我只做了一个快速而肮脏的基准测试,从一个磁盘读取一个文件并写入另一个磁盘(所以我实际测试的是代码而不是磁盘)。
Averages:
InputStream -> OutputStream : 321 ms.
FileChannel -> FileChannel : 3 ms.
InputStream -> FileChannel : 600 ms.
实际上,我尝试使用混合java.io - > java.nio的性能更差。 A LOT的nio-> nio速度更快,但我被Servlet InputStream卡住了。
纯粹的NIO解决方案的主要优点是您可以避免将数据从内核复制到用户并返回到内核空间。 当您使用transferTo()
或transferFrom()
操作时,可以避免此开销,并且通道之间的传输可能非常快(取决于底层实现)。
但是,Servlet API不允许您访问源Channel
; 当你的servlet看到数据时,它们就在用户空间中。 所以我不希望通过写入Channel
来提升性能。
HttpServletRequest为你提供了一个常规的“拉”输入流 - 看不出在这里如何使用NIO。
你不能认真比较性能和短至毫秒的测试。
由于API的选择,磁盘不会旋转得更快。 在FileChannel-> FileChannel中发生的事情可能是在写入实际提交到磁盘之前返回的调用。
nio
可以节省一些CPU /内存使用量。 但在你的情况下并不多。 用于保存用户上传的文件,通常采用multipart / form-data格式,服务器必须逐字节读取流解析输入和解压缩文件内容,不能直接将原始流转储到文件。
下一篇: Java sockets: can I write a TCP server with one thread?