如何加快使用Java Mail保存附件的时间?

时间:2016-02-21 05:51:32

标签: performance io javamail

我将 Message msg 分成 Multipart multi1 =(Multipart)msg.getContent()。 邮件附件在一个BodyPart中, Part part = multi1.getBodyPart(i); 然后我想保存附件。

private void saveFile(String fileName, InputStream in) throws IOException {
File file = new File(fileName);
if (!file.exists()) {
  OutputStream out = null;
  try {
    out = new BufferedOutputStream(new FileOutputStream(file));
    in = new BufferedInputStream(in);
    byte[] buf = new byte[BUFFSIZE];
    int len;
    while ((len = in.read(buf)) > 0) {
      out.write(buf, 0, len);
    }
  } catch (FileNotFoundException e) {
    LOG.error(e.toString());
  } finally {
    // close streams
    if (in != null) {
      in.close();
    }
    if (out != null) {
      out.close();
    }
  }
}

但是在阅读IO Stream时花费了太多时间。例如,2.7M文件需要大约160秒才能保存在磁盘上。我已经尝试过Channel和其他一些IO Stream,但没有任何改变。使用Java Mail保存附件的任何解决方案?

了解更多代码信息https://github.com/cainzhong/java-mail-demo/blob/master/src/main/java/com/java/mail/impl/ReceiveMailImpl.java

2 个答案:

答案 0 :(得分:4)

实际上,mail.imaps.partialfetch生效并加速了很多。我之前的代码有一个错误。

props.put("mail.imap.partialfetch","false");
props.put("mail.imap.fetchsize", "1048576"); 
props.put("mail.imaps.partialfetch", "false"); 
props.put("mail.imaps.fetchsize", "1048576"); 

而不是

props.put("mail.imap.partialfetch",false);
props.put("mail.imap.fetchsize", "1048576"); 
props.put("mail.imaps.partialfetch", false); 
props.put("mail.imaps.fetchsize", "1048576"); 

在" false"上加上引号很重要。如果没有,参数将不起作用。

无论如何,多亏Bill Billnon。

答案 1 :(得分:1)

此操作有两个关键部分 - 从邮件服务器读取数据并将数据写入文件系统。很可能是服务器的速度和服务器的网络连接控制着整体操作速度。您可以尝试设置mail.imap.fetchsizemail.imap.partialfetch属性,看看是否可以提高性能。

您也可以尝试使用NullOutputStream而不是FileOutputStream来测量读取数据的速度。