解決JavaMail附件名字過長導致的亂碼問題
問題背景:
公司有個業務場景是稽核客戶機構通過後,給客戶傳送一封郵件,並將機構相關材料以附件形式一塊傳送,有些附件名正常,有些就亂了,如下圖:
後來發現是附近名稱過長導致的!
問題原因:java mail中設定附件名稱會採用 base64格式進行編碼,如果附件名稱過長會被進行切割,將剩下字元抹去,所以導致不知道這是什麼格式的檔案。
注:雖然將檔案格式被改變了,但是若強制轉換成原格式(右鍵->另存為->xxx.pdf) 仍然可以進行開啟,檔案內容也並非改變(這是測試後的結果)
解決方案:
由於是spring boot 專案,只需要在main方法中加入以下 程式碼即可(大概意思就是,取消切割,預設是true)
System.setProperty("mail.mime.splitlongparameters","false");
補充知識:LinkedList的增刪一定比ArrayList快嗎?
1.背景
眾所周知,arrayList底層是通過陣列實現,當其超過容量時,會進行1.5的擴容,將原陣列資料遷移至新陣列中。
而LinkedList底層為雙向連結串列,其增加操作直接在尾部新增一個node節點即可。
那麼,在插入相同的資料情況下(集合預設長度都是0),到底誰更快呢?
2.案例
public static void main(String[] args) { List<String> array = new ArrayList<>(); List<String> linked = new LinkedList<>(); long start = System.currentTimeMillis(); int index = 10000000; for (int i = 0; i < index; i++) { array.add("" + i); } long end = System.currentTimeMillis(); System.out.println("ArrayList用時:" + (end - start) / 1000 + "s"); start = System.currentTimeMillis(); for (int i = 0; i < index; i++) { linked.add("" + i); } end = System.currentTimeMillis(); System.out.println("LinkedList用時:" + (end - start) / 1000 + "s"); }
3.結果
4.分析
此處我是這麼理解的,arrayList是通過下標直接去放入資料,而linked需要建立一個Node然後 將資料放入,再與前節點建立連結。
然後不需要擴容的情況下,明顯arrayList快,那麼擴容呢?其實我們測試用的是尾部插入。
也就是arrayList擴容後直接將前面的資料放入對應下標,之後的在繼續按照下標插入就行,也就是有序在尾部插入。
如果資料量大通過尾部插入的話(不指定下標,預設就是在尾部插入),linked的插入需要建立對應的物件,繫結關係,
而array則直接放置,其擴容也是按照原來順序放入新陣列,速度比較連結串列 要更快。
我還專門做了一個按照頭部插入的方式,發現這時明顯連結串列高於陣列的速度。
5.總結(個人觀點)
陣列比之連結串列:
在需要擴容的前提下
插入效率隨著下標的遞增,其效能逐漸由連結串列偏向陣列。
下標靠中間(連結串列的查詢慘不忍睹),所以其中間效率也是極低的
而陣列插入的下標靠前,會涉及其下標之後元素移位操作,所以index越靠前插入,效率越低
6.插入效能
以上這篇解決JavaMail附件名字過長導致的亂碼問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。