java - Java 中的内存高效文件/图像上传?

标签 java servlets grails grails-2.0

我想上传2MB - 10MB的图片到我的服务器并直接保存到硬盘。目标是尽可能多地节省 JVM 的堆内存,因为如果用户同时上传,我的系统不应崩溃。

我现在就是这样做的。当上传请求进入我的 Controller 时,我会:

CommonsMultipartFile file = (CommonsMultipartFile) request.getFile('image')
InputStream inputStream = file.inputStream
byte [] byteFile = inputStream.getBytes()

try{
  def fullPath = // some image path and file name
  def newFile = new FileOutputStream(fullPath)
  newFile.write(byteFile)
  newFile.close()
}
catch(IOException e){ }

Here我读到有 ImageIO 和 java.awt.Toolkit,其中 Toolkit 应该是存储文件最快的。

如何改进上传以尽可能少地使用堆并尽可能快地上传?

替代方案 1:

替代方案可能是:

CommonsMultipartFile file = (CommonsMultipartFile) request.getFile('image')
def fullPath = // some image path and file name
file.transferTo(new File(fullPath))

哪个更好?

最佳答案

您当前的代码接收包含文件内容的输入流,但随后将该流的全部内容缓冲在 byte[] 中,然后再将其写入磁盘上的文件。您的“替代方案 1”直接从输入流流到磁盘上的文件,因此内存效率更高,并且至少与当前的缓冲方法一样快(可能更快,因为沿途收集的垃圾更少)。

关于java - Java 中的内存高效文件/图像上传?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18513894/

相关文章:

java - 使用 google API 在 jsp 页面上显示流程图的最佳方式

java - 在运行的 servlet 中从 Eclipse 修改 Java 类?

java - Grails智能获取war baseUrl?

grails - 如果URL不包含额外路径,如何显示身份验证页面?

Grails品牌应用

java - java中来自数据库的Json对象

Java从混合数组中删除奇数

java - 我的 javafx 代码已成功混淆,但现在由于从主方法加载 .fxml 文件时出错而无法运行

java - Android Java : Reading file from zip file into webview/string, 为什么ZipInputStream限制读取性能?

java - 将图像转换为 byteArray 并保持颜色