Javamail - 如何处理大附件?
Posted
技术标签:
【中文标题】Javamail - 如何处理大附件?【英文标题】:Javamail - How to handle large attachments? 【发布时间】:2013-01-27 19:27:45 【问题描述】:在 imap 上,我试图从多条消息中获取附件。 它工作正常,但如果有一个大约 20 兆字节的附件,那么它似乎卡住了,java 没有继续。
这里是问题发生的地方: 我想获取附件的内容并将其保存到字符串中:
...
MimeBodyPart attachment = (MimeBodyPart) multipart.getBodyPart(1);
if(!Part.ATTACHMENT.equalsIgnoreCase(attachment.getDisposition()))
log.error("Part is not an attachment!");
else
log.debug("Checking " + localFile.getName() + " with " + attachment.getFileName() + ". Attachment-Size: " + (attachment.getSize()/(1024*1024)) + " mega-bytes.");
InputStream remoteFileIs = attachment.getInputStream();
remoteFileContent = IOUtils.toString(remoteFileIs); //stucked here, when attachment is large
remoteFileIs.close();
...
...
有解决办法吗?
问候!
【问题讨论】:
【参考方案1】:IOUtils.toString 有什么作用?由于您只是给它一个 InputStream,没有字符集信息,因此它不可能正确地将字节流转换为字符。无论它在做什么,它都可能对大数据效率低下。
您可以在JavaMail Session debugging and see the protocol trace 获取附件时打开它,以确定它是真的“卡住”还是慢了。
您还可以通过设置mail.imap.fetchsize property 来控制从 IMAP 服务器提取的缓冲区大小。
但也许您应该质疑您是否真的想要一个 20MB 的字符串附件。拥有该字符串后,您将如何处理它?
【讨论】:
现在可以使用了。我将获取设置为 props.put("mail.imaps.fetchsize","22020096");这是21MB。那样可以么? fetch-size 过大有什么不好的地方吗? 您将使用更多内存,并且您必须等待整个部分下载后才能处理它。但是,您对 IOUtils.toString 的使用也是如此。 @Dave 您不需要获取大小与附件一样大。它应该是一个合理的“块”,设置一个可以在短时间内下载的目标大小。我建议小于 2mb。以上是关于Javamail - 如何处理大附件?的主要内容,如果未能解决你的问题,请参考以下文章