Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaNIOServlet到文件_Java_Performance_Servlets_Nio - Fatal编程技术网

JavaNIOServlet到文件

JavaNIOServlet到文件,java,performance,servlets,nio,Java,Performance,Servlets,Nio,有没有一种方法(不缓冲整个Inputstream)从Javaservlet获取HttpServletRequest并使用所有NIO将其写入文件?值得一试吗?从普通java.io流读取和写入java.nio通道会更快吗?还是它们都需要纯nio才能看到好处?谢谢 编辑: 所以我只是做了一个快速而肮脏的基准测试,从一个磁盘读取一个文件,然后写入另一个磁盘(所以我实际上是在测试代码,而不是磁盘) 实际上,我在尝试使用混合java.io->java.nio时性能变差了。nio->nio的速度快了很多,但我

有没有一种方法(不缓冲整个Inputstream)从Javaservlet获取HttpServletRequest并使用所有NIO将其写入文件?值得一试吗?从普通java.io流读取和写入java.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.