我正在尝试使用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]);
}
}
答案 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++;
}
一切顺利,
路