读取并存储大型ASCII文件的内容

时间:2015-11-02 18:34:15

标签: java ascii large-files

我有一个538MB的ASCII文件,有16807行,每行有16807个0和1个空格分隔。我想获取所有这些值并将它们存储在列表列表中,以便将每一行存储在新列表中。

在之前的项目中,我为文本文件制作了以下代码,但是使用ASCII文件时,它会抛出Java堆空间错误。

ArrayList<ArrayList<String>> listOflists = new ArrayList<ArrayList<String>>();

    FileInputStream fstream = new FileInputStream("C:\Users...\file.txt");
    DataInputStream in = new DataInputStream(fstream);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));

    while (true)
    {
        String line = br.readLine();
        if (line == null) {
            break;
        }

        Scanner tokenize = new Scanner(line);
        ArrayList<String> tokens = new ArrayList<String>();

        while (tokenize.hasNext()) 
        {
            tokens.add(tokenize.next());
        }
        listOflists.add(tokens);
    }
    br.close();

现在我创建了这段代码,但又一次抛出了Java堆空间错误。

String inputFile = "C:\Users...\file.txt";

    LinkedList<LinkedList<Character>> charList = new LinkedList<LinkedList<Character>>();

    File file = new File( inputFile );
    Reader reader = new FileReader(file);
    char val = 0;
    int c;
    int iLine = 0;

    while( (c = reader.read()) != -1) {

        val = (char)c;
        charList.add(new LinkedList<Character>());

        if((c == 48) || (c == 49)){ //ascii code for 0 is 48 and for 1 is 49
            charList.get(iLine).add(val);
        }
        if( c == 92 ){ //ascii code for "/" is 92 as to know when it changes line
            iLine++;
     } 
}
reader.close();

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

你有一个空列表

LinkedList<LinkedList<Character>> charList = new LinkedList<LinkedList<Character>>();

并且您正在尝试获取第一个元素

charList.get(iLine)

从空列表中抛出IndexOutOfBoundsException。

答案 1 :(得分:0)

您使用行LinkedList为while循环的每次迭代添加新的charList.add(new LinkedList<Character>());,即使该行没有变化。

答案 2 :(得分:0)

我不确切知道我之前的代码中的错误在哪里但是这里是一个解决方案,我读取文件并将1的位置存储在列表中(首先是列,然后是我找到它的行)。 为了提供更多帮助,我还更改了项目的VM Option并添加-Xmx1g以增加堆大小。没有这个我得到一个OutOfMemory错误(运行3G RAM系统中的代码)

{{1}}