Java NIO Servlet 到文件

标签 java performance servlets nio

有没有一种方法(无需缓冲整个输入流)从 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 时得到了更差的性能。 nio->nio 快了很多,但我仍然坚持使用 Servlet InputStream。

最佳答案

纯 NIO 解决方案的主要好处是您可以避免将数据从内核复制到用户并返回到内核空间。当您使用 transferTo()transferFrom() 操作时,可以避免这种开销并且 channel 之间的传输可以非常快(取决于底层实现)。

但是,Servlet API 不允许您访问源 Channel;当您的 servlet 看到数据时,它们已经在用户空间中了。所以我不希望通过写入 Channel 来提高性能。

关于Java NIO Servlet 到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3063540/

相关文章:

java - Selenium webdriver 不退出 chrome 驱动程序

r - 如何在矩阵中按行将 0 分配给最小值(以快速/有效的方式)?

java - 错误: java. lang.ClassNotFoundException : com. mysql.jdbc.Driver?

java - 将请求从 servlet 重定向到 jsp 时出现 404 错误

java - 如何将参数从表单发送到 Servlet(出生日期)(选择日、月、年、选项)Java

java - 如何在 Java 中使用 TLSV1 或 SSLV3 进行第一次握手(Client Hello)?

java - web.xml 无法正确标记 spring ServletDispatcher

java - 如何确保我的 arrayList 中嵌套私有(private)类的对象是我想要的?

c# - 如何在 C# 中解析文本文件并进行 io 绑定(bind)?

java - OpenJpa 查询缓存在空值的情况下不刷新