2017-11-10 84 views
0

我們正在尋找有保存在設備中的一些事件引用一個字符串生成器,拿着一個靜態的StringBuilder

我們考慮寫入和讀取一個文件,但開放的成本和我們編寫的每個時間關閉文件似乎太高了。

的問題是,有時我們得到一個StackOverflow的例外,即使我們儘量保持StringBuilder的只是一個定義的大小

public class DiagnosticUtil { 

private static final int DIAGNOSTIC_SIZE = 5000; 

public static StringBuilder DIAGNOSTICS_HOLDER = new StringBuilder(DIAGNOSTIC_SIZE); 

public static void addDiagnosticLine(String message){ 
    try { 
     //Limits the size of the diagnostics recolection removing the first 2000 characters 
     if (DiagnosticUtil.DIAGNOSTICS_HOLDER.length() > DIAGNOSTIC_SIZE - 300) { 
      DiagnosticUtil.DIAGNOSTICS_HOLDER.delete(0, DiagnosticUtil.DIAGNOSTICS_HOLDER.length() - 2000); 
     } 
     DIAGNOSTICS_HOLDER.append(TimeUtils.getCurrentDate()).append(message).append("\n"); 
    }catch (Exception e){ 
     Timber.d("Error saving additional data"); 
    } 

} 

}

的問題是,這是一個好辦法?還是應該將這些日誌保存到外部文件?

謝謝!

+0

'StringBuilder'不持有引用到任何東西,更別說事件。你在尋找某種「藏品」嗎? – EJP

回答

0

當您創建具有首選大小的StringBuilder時會消耗內存,因爲在StringBuilder內部創建具有此大小的char []數組之前,將任何字符串傳遞給它,因此您需要使用默認構造函數。爲什麼你決定在那裏使用Builder而不是List?我看不到所有的圖片,但我認爲你可能更喜歡用兩種方法選擇不同的東西(內存日誌和文件日誌存儲)當你收集一定數量的消息時簡單地將它寫入文件,這樣你就不需要爲每條消息觸摸文件系統,而不是使用該數量的日誌數據填充內存。你需要的代碼是這樣的:

public class DiagnosticUtil { 
    private final static int threshold = 1000; 
    private static List<String> messages = new ArrayList<>(); 
    private static final File log = new File("path to your file"); 

    public static void addDiagnosticLine(String message) { 
     if (messages.size() > threshold) { 
      try (BufferedWriter file = new BufferedWriter(new FileWriter(log))) { 
       for (String msg : messages) { 
        file.write(msg); 
       } 
       file.flush(); 
      } catch (IOException e) { 
       Timber.d("Error saving additional data " + e); 
      } 
      messages = new ArrayList<>(); 
     } else { 
      messages.add(TimeUtils.getCurrentDate() + message + "\n"); 
     } 
    } 
} 

注意這是程序代碼,而不是空中接力,UTIL類是壞

+0

很好的答案!謝謝 –