我需要创建一个电子邮件,其中包含一个动态组成的附件。在我的初稿中,我将附件构建为一个String。但是在代码中,其他人指出,字符串可能非常大。它通常是几千字节,但偶尔它可能是兆字节。所以他们说我应该将它逐行写入临时文件,然后将文件附加到电子邮件中。否则,我可能会用完堆空间。在发送前javamail是否将附件加载到内存中?
我想知道这是否有帮助。如果JavaMail在发送之前将整个文件读入内存,则不会有任何区别。当然,创建一个临时文件引入了其他的烦恼,比如找到一个合适的目录来放置它,确保我拥有权限等等。但是,如果Javamail以一些适度大小的块读取文件,那么它会避免无用的,内存问题。
一个问题是:据我了解,Javamail同步发送。所以,如果我创建文件,发送它,然后删除文件,那么在文件实际发送之前不应该有删除文件的问题,对吧?
JavaMail内部似乎是相当不错的流数据,而不是缓冲它。有几种情况可以缓冲,但这些都是例外而非规则。如果您不想单步执行源代码,那么一个简单的实验就是将8 MB的堆分配给您的java进程并尝试发送一个10 MB的文件。 – dnault 2011-05-04 20:44:20
哦,是的,在调用send方法之后立即删除文件是安全的。 – dnault 2011-05-04 20:46:56
@dnault:简单测试的好处。我通常很快进行实证测试,而不是从哲学角度进行思考,但出于某种原因,我的大脑冻结了,并没有想到这个简单的实验。 – Jay 2011-05-09 13:48:43