2

在 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();
    ...
}
...

有什么解决办法吗?

问候!

4

1 回答 1

3

IOUtils.toString 有什么作用?由于您只是给它一个 InputStream,没有字符集信息,因此它不可能正确地将字节流转换为字符。无论它在做什么,对于大数据,它都可能效率低下。

您可以打开JavaMail Session 调试并在它获取附件时查看协议跟踪,以确定它是真的“卡住”还是很慢。

您还可以通过设置mail.imap.fetchsize 属性来控制从 IMAP 服务器提取的缓冲区大小。

但也许你应该质疑你是否真的想要一个 20MB 的字符串附件。拥有该字符串后,您将如何处理它?

于 2013-02-12T19:49:47.407 回答