持有一个静态的StringBuilder

时间:2017-11-10 22:18:24

标签: java android

我们希望有一个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");
    }

}

}

问题是,这是一个好方法吗?或者我们应该将此日志保存到外部文件中吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

当您使用首选大小创建StringBuilder时,您会占用内存,因为在您将任何String传递给它之前,StringBuilder内部创建了具有此大小的char []数组,因此您需要在那里使用默认构造函数。为什么你决定在那里使用Builder而不是List?我没有看到所有图片,但我认为您可能更愿意选择两种不同的方式(内存日志和文件日志存储)当您收集一定数量的邮件时,只需将其写入文件,这样您就不会# 39;需要触摸每个消息的文件系统,不要使用该数量的日志数据填充内存。你需要这样的代码:

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类是坏的