我有一个像桌面java swing应用程序的聊天,我不断收到字符串类型的数据。最终,String变量越来越大。
1)将大变量保留在内存中是否明智,只有在日志记录完成后才将其保存到磁盘。
2)如果没有,那么每次我得到一个新的字符串(长度约为30-40)时我应该继续保存。
我应该如何优化这样的设计?
答案 0 :(得分:4)
我会使用BufferedWriter,比如PrintWriter。这将为您缓冲数据并每8 KB写一次(实际上每8192个字符)。如果你想更频繁地写,你可以使用flush()或更小的缓冲区。
PrintWriter pw = new PrintWriter("my.log");
// will actually write to the OS, 5 times. (1000 * 40 / 8192)
for(int i = 0; i < 1000; i++) {
pw.printf("%39d%n", i); // a 40 character number.
}
pw.flush();
或者您可以使用
pw.println(lineOfText);
BTW:如果你想知道一个非常庞大的文件是什么样的;)这个例子写了一个8 TB的文件http://vanillajava.blogspot.com/2011/12/using-memory-mapped-file-for-huge.html
答案 1 :(得分:1)
也许您应该使用StringBuilder
。将每条新消息附加到它,最后将其转换为字符串。
例如,
StringBuilder sb = new StringBuilder();
// Do your code that continuously adds new messages/strings.
sb.append(new_string);
// Then once you are done...
String result = sb.toString();
如果你有一些字符串,比如说String message
,每次你得到message += new_string
的新消息/字符串时,都会占用更多的内存。
正如Viruzzo所建议的那样,只有保存这么多,然后在某些时候丢弃早期的字符串。不要永远坚持每一条信息。