簡體   English   中英

持有一個靜態的StringBuilder

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM