我们希望有一个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");
}
}
}
问题是,这是一个好方法吗?或者我们应该将此日志保存到外部文件中吗?
谢谢!
答案 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类是坏的