我需要創建一個電子郵件,其中包含一個動態組成的附件。在我的初稿中,我將附件構建爲一個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