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++;
}
祝一切顺利,
卢克
我正在尝试使用 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++;
}
祝一切顺利,
卢克