over 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();
...
}
...
这有什么解决方案吗?
问候!
答案 0 :(得分:2)
IOUtils.toString做什么?由于您只是给它一个没有字符集信息的InputStream,因此无法将字节流正确转换为字符。无论它在做什么,它都可能对大数据效率低下。
您可以在获取附件时打开JavaMail Session debugging and see the protocol trace,以确定它是否真的“卡住”或只是缓慢。
您还可以通过设置mail.imap.fetchsize property来控制从IMAP服务器获取的缓冲区大小。
但也许你应该质疑你是否真的想要一个字符串中的20MB附件。一旦你拥有它,你打算用它做什么?