1. 程式人生 > 程式設計 >解決JavaMail附件名字過長導致的亂碼問題

解決JavaMail附件名字過長導致的亂碼問題

問題背景:

公司有個業務場景是稽核客戶機構通過後,給客戶傳送一封郵件,並將機構相關材料以附件形式一塊傳送,有些附件名正常,有些就亂了,如下圖:

解決JavaMail附件名字過長導致的亂碼問題

解決JavaMail附件名字過長導致的亂碼問題

後來發現是附近名稱過長導致的!

問題原因:java mail中設定附件名稱會採用 base64格式進行編碼,如果附件名稱過長會被進行切割,將剩下字元抹去,所以導致不知道這是什麼格式的檔案。

注:雖然將檔案格式被改變了,但是若強制轉換成原格式(右鍵->另存為->xxx.pdf) 仍然可以進行開啟,檔案內容也並非改變(這是測試後的結果)

解決方案:

由於是spring boot 專案,只需要在main方法中加入以下 程式碼即可(大概意思就是,取消切割,預設是true)

System.setProperty("mail.mime.splitlongparameters","false");

解決JavaMail附件名字過長導致的亂碼問題

補充知識: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.結果

解決JavaMail附件名字過長導致的亂碼問題

4.分析

此處我是這麼理解的,arrayList是通過下標直接去放入資料,而linked需要建立一個Node然後 將資料放入,再與前節點建立連結。

然後不需要擴容的情況下,明顯arrayList快,那麼擴容呢?其實我們測試用的是尾部插入。

也就是arrayList擴容後直接將前面的資料放入對應下標,之後的在繼續按照下標插入就行,也就是有序在尾部插入。

如果資料量大通過尾部插入的話(不指定下標,預設就是在尾部插入),linked的插入需要建立對應的物件,繫結關係,

而array則直接放置,其擴容也是按照原來順序放入新陣列,速度比較連結串列 要更快。

我還專門做了一個按照頭部插入的方式,發現這時明顯連結串列高於陣列的速度。

5.總結(個人觀點)

陣列比之連結串列:

在需要擴容的前提下

插入效率隨著下標的遞增,其效能逐漸由連結串列偏向陣列。

下標靠中間(連結串列的查詢慘不忍睹),所以其中間效率也是極低的

而陣列插入的下標靠前,會涉及其下標之後元素移位操作,所以index越靠前插入,效率越低

6.插入效能

解決JavaMail附件名字過長導致的亂碼問題

以上這篇解決JavaMail附件名字過長導致的亂碼問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。