BufferReader 填充二维数组缺少最后一行

BufferReader populating 2D array missing last line

我正在尝试使用 BufferReader 填充二维数组,它成功地填充了数组的所有行,除了最后一行。我试过将循环增加一个来解释那条线,但我得到了一个索引越界错误。我怎样才能显示最后一行?

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]);
       }
    }

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

鉴于该代码和该文件,并且 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'

或table形式:

    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
}

我看到 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");
    }

循环访问结果列表的一些代码:

    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++;
    }

祝一切顺利,

卢克