[英]Holding an static StringBuilder
我們希望有一個String構建器,其中包含對設備中某些事件的引用,
我們考慮讀寫文件,但是每次寫入文件時打開和關閉文件的成本似乎太高了。
問題是,有時即使我們嘗試將StringBuilder保持為定義的大小,有時也會遇到StackOverflow異常
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");
}
}
}
問題是,這是一個好方法嗎? 還是我們應該將此日志保存到外部文件?
謝謝!
當創建具有首選大小的StringBuilder時,會消耗內存,因為在StringBuilder內部將具有此大小的char []數組傳遞給任何String之前,因此需要在其中使用默認構造函數。 您為什么決定在那里使用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");
}
}
}
注意這是程序代碼,不是oop,util類不好
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.