JavaNIOServlet到文件
有没有一种方法(不缓冲整个Inputstream)从Javaservlet获取HttpServletRequest并使用所有NIO将其写入文件?值得一试吗?从普通java.io流读取和写入java.nio通道会更快吗?还是它们都需要纯nio才能看到好处?谢谢 编辑: 所以我只是做了一个快速而肮脏的基准测试,从一个磁盘读取一个文件,然后写入另一个磁盘(所以我实际上是在测试代码,而不是磁盘)JavaNIOServlet到文件,java,performance,servlets,nio,Java,Performance,Servlets,Nio,有没有一种方法(不缓冲整个Inputstream)从Javaservlet获取HttpServletRequest并使用所有NIO将其写入文件?值得一试吗?从普通java.io流读取和写入java.nio通道会更快吗?还是它们都需要纯nio才能看到好处?谢谢 编辑: 所以我只是做了一个快速而肮脏的基准测试,从一个磁盘读取一个文件,然后写入另一个磁盘(所以我实际上是在测试代码,而不是磁盘) 实际上,我在尝试使用混合java.io->java.nio时性能变差了。nio->nio的速度快了很多,但我
实际上,我在尝试使用混合java.io->java.nio时性能变差了。nio->nio的速度快了很多,但我仍然坚持使用Servlet InputStream。HttpServletRequest为您提供了一个常规的“拉”输入流-不知道在这里使用nio会有什么帮助。我想您不用担心什么。平均网络速度(~1MB/s)远远赶不上平均硬盘速度(~100MB/s)(即使是最乐观的平均速度)。FileChannel不会给您带来任何好处。“遗留的”
java.io
已经足够了。纯NIO解决方案的主要好处是,您可以避免将数据从内核复制到用户和内核空间。使用transferTo()
或transferFrom()
操作时,可以避免此开销,并且通道之间的传输可以非常快(取决于底层实现)
但是,Servlet API不允许您访问源
频道
;当servlet看到数据时,它们已经在用户空间中了。因此,我不希望通过写入通道
来提高性能。您不能认真地将性能与最短为毫秒的测试进行比较
由于API的选择,磁盘的旋转速度不会更快。在FileChannel->FileChannel中发生的情况可能是调用在写入实际提交到磁盘之前返回
nio
可以节省一些cpu/内存的使用。但在你的情况下不多。对于保存用户上传的文件,通常采用多部分/表单数据的格式,服务器必须逐字节读取流来解析输入并提取文件内容,不能直接将原始流转储到文件中 这就是我的感觉,除了FileChannel可以使用DMA将流写入磁盘,这可能会提高性能。
Averages:
InputStream -> OutputStream : 321 ms.
FileChannel -> FileChannel : 3 ms.
InputStream -> FileChannel : 600 ms.