在java中存储文本文档:内存使用情况

时间:2015-06-22 17:05:09

标签: java list memory arraylist

我想编写自定义文本区域小部件,为此我需要找到存储文本文档的好方法。 由于我需要能够编辑它,我需要在任何位置轻松访问任何行和char。

然后我的想法是将文档存储为字符列表的列表:List<List<Character>> lines(使用ArrayList实现)。

这种方法有效,我可以轻松访问line / char,但最令我惊讶的是内存使用情况。

我生成了一个包含10万个字符的文件并将其加载到结构中。

List<List<Character>> lines = new ArrayList<List<Character>>();
List<Character> line;

BufferedReader br = new BufferedReader(new FileReader(file));
for(String str; (str = br.readLine()) != null; ) {
    line = new ArrayList<Character>();
    for (char c : str.toCharArray()) 
        line.add(c);

    lines.add(line);
}

100k个字符需要 ~1.1GB 的内存!我将它与C#进行了比较,采用相同的方法,只需要约350 MB。

当然它仍然是很多内存,考虑到事实char在Java / C#中是2个字节,然后是100000000个字符= ~190MB,其余是List / ArrayList内存。

我知道Java是内存使用者,但它是如何实现的却需要Java中的大量内存? (特别是考虑到C#只占用350mb而且两者都是同一级语言) 那么存储文本文档的更好方法是什么?

修改

List<StringBuilder>的内存使用情况:

Java:~500MB

C#:~300MB

C#代码:

List<List<char>> lines = new List<List<char>>();
string str;
while ((str = file.ReadLine()) != null)
{
    List<char> line = new List<char>();

    foreach (char c in str)
        line.Add(c);

    lines.Add(line);
}

1 个答案:

答案 0 :(得分:1)

只需使用ArrayList<String>即可。您可以使用charAt()在String中的任何位置访问任何char,并且很容易在String中插入更多字符。