BufferReader填充缺少最后一行的2D数组

时间:2015-02-01 05:05:50

标签: java multidimensional-array bufferedreader

我正在尝试使用BufferReader来填充2D数组,并且它成功填充了数组的所有行,除了最后一个。我已经尝试将循环增加一个来计算该行,但是我得到一个索引超出范围的错误。如何才能显示最后一行?

public static void  inputArray(char[][] outArray, String filename) {
BufferedReader br = null;
try {
    br = new BufferedReader(new FileReader(filename));
    for(int i = 0; i < outArray.length; i++) {
       for(int j = 0; j < outArray[0].length; j++){
        outArray[i][j] = (char)br.read();
       }
    }
    br.close();
}
catch (IOException e) {
    System.out.println("Error opening the file");
}
}

以下是一些示例输出:

abcd
efgh
ijkl
mnop
qrst
uvwx

文件内容:

abcd
efgh
ijkl
mnop
qrst
uvwx
yzab

这是我用来打印数组的代码:

    for(int i = 0; i < test.length; i++) {
       for(int j = 0; j < test[0].length; j++) {
          System.out.printf("%1c",test[i][j]);
       }
    }

2 个答案:

答案 0 :(得分:1)

您正在将新换行存储在数组中。

鉴于代码和该文件以及outArray包含[7] [4]元素,outArray最终应该包含:

outArray[0][0] == 'a'
outArray[0][1] == 'b'
outArray[0][2] == 'c'
outArray[0][3] == 'd'
outArray[1][0] == '\n'
outArray[1][1] == 'e'
outArray[1][2] == 'f'
outArray[1][3] == 'g'
outArray[2][0] == 'h'
outArray[2][1] == '\n'
outArray[2][2] == 'i'
outArray[2][3] == 'j'
// etc
outArray[6][0] == '\n'
outArray[6][1] == 'u'
outArray[6][2] == 'v'
outArray[6][3] == 'w'

或表格形式:

    0    1    2    3
0  'a'  'b'  'c'  'd'
1 '\n'  'e'  'f'  'g'
2  'h' '\n'  'i'  'j'
3  'k'  'l' '\n'  'm'
4  'n'  'o'  'p' '\n'
5  'q'  'r'  's'  't'
6 '\n'  'u'  'v'  'w'

这是因为您忽略了您的文件还包含换行符的事实。如果您的文件没有包含任何换行符(即它全部在一行上),那么您的代码将成功将其读入7x4数组。

如果您的文件始终具有相同的格式,则可以跳过换行符(因为您知道在哪里可以看到它们),如下所示:

for(int i = 0; i < outArray.length; i++) {
   for(int j = 0; j < outArray[0].length; j++){
    outArray[i][j] = (char)br.read();
   }
   br.read(); // read the next character (which will be a newline) and ignore it
}

答案 1 :(得分:0)

我看到Immebis已经提供了一个很好的答案。以下是我为你写的一些代码。

我总是试图避免假定文件的内容。这可能看起来有点令人生畏,但它使您能够专注于您的意图(长度为4的数组),而无需担心您需要满足多少。 (如果文件内容添加了另一个角色,或删除一个......或成为小说,该怎么办?)

    String filename = "testData.txt";
    final int ARRAY_SIZE = 4;
    BufferedReader br = null;
    List<char[]> data = new ArrayList<char[]>();
    try {
        br = new BufferedReader(new FileReader(filename));

        int characterIndex = 0;
        char[] nextRow = null;
        int charValue = 0;

        // You don't have to know how many characters are in the input file, in advance
        while((charValue = br.read()) != -1)
        {
            char c = (char)charValue;

            // Discard newlines
            if(c == '\n' || c == '\r')
            {
                continue;
            }

            if(characterIndex % ARRAY_SIZE == 0)
            {
                nextRow = new char[ARRAY_SIZE];
                data.add(nextRow);
                characterIndex = 0;
            }

            nextRow[characterIndex++] = c;
        }
        br.close();
    }
    catch (IOException e) {
        System.out.println("Error opening the file");
    }

迭代生成List的一些代码:

    int rowIndex = 0;
    for(char[] row : data)
    {
        for(int i = 0; i < ARRAY_SIZE; i++)
        {
            System.out.print("array[" + rowIndex + "][" + i + "] - " + row[i]);
            System.out.print("\n");
        }
        rowIndex++;
    }

一切顺利,