我正在尝试读取一个简单的。csv文件并创建字符串的2D数组。下面是数组:
1,1,1,1,1,1
2,2,2,2,2,2
3,3,3,3,3,3
4,4,4,4,4,4
我的代码应该找到六列和四行,但它在第三列之后停止并移动到下一行,我不知道为什么会发生这种情况。
除此之外,即使提前退出,它也会返回一个越界异常。Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
下面是代码,后面跟着输出。
public String[][] ascToStringArray(String ascFileIn) {
String directory ="c:\data\"; // "" is an illegal character
String[][] numbers= new String[4][6]; // 4 rows 6 columns
try{
BufferedReader Br = new BufferedReader(new FileReader(directory + ascFileIn));
String line;
int row = 0;
int col = 0;
//read each line of text file
while((line = Br.readLine()) != null)
{
StringTokenizer st = new StringTokenizer(line,",");
//Populating Columns
while (st.hasMoreTokens())
{
//get next token and store it in the array
numbers[row][col] = st.nextToken();
System.out.println(row + " " + col + " = " + st.nextToken());
col++;
}
row++;
}
//close the file
Br.close();
return numbers;
}
catch(IOException exc) {
System.out.println("Error reading file.");
return numbers;
}
}
输出如下:
0 0 = 1
0 1 = 1
0 2 = 1
1 3 = 2
1 4 = 2
1 5 = 2
如果有人能弄清楚为什么它提前退出,并抛出一个越界错误,无论我做多大的数组,我真的很感激。
您使用了两次nextToken
numbers[row][col] = st.nextToken();<-1---
System.out.println(row + " " + col + " = " + st.nextToken());<--2--Skips element
但是只使用一个值,所以一行中只会添加三个元素
异常原因
在inner while循环执行后,您没有重置col=0
,这导致ArrayIndexOutOfBound
for col=6
为col size在数组中为6意味着0到5,因此当col=6
.
首先,内部while循环中的system.out.println消耗一个令牌。其次,在进入内部while循环时,您应该重置cols
文件。为零。
public String[][] ascToStringArray(String ascFileIn) {
String directory = "c:\data\"; // "" is an illegal character
String[][] numbers = new String[4][6]; // 4 rows 6 columns
try {
BufferedReader Br = new BufferedReader(new FileReader(directory + ascFileIn));
String line;
int row = 0;
int col = 0;
// read each line of text file
while ((line = Br.readLine()) != null) {
StringTokenizer st = new StringTokenizer(line, ",");
col = 0;
// Populating Columns
while (st.hasMoreTokens()) {
// get next token and store it in the array
numbers[row][col] = st.nextToken();
col++;
}
row++;
}
// close the file
Br.close();
return numbers;
} catch (IOException exc) {
System.out.println("Error reading file.");
return numbers;
}
}
这是因为您调用了两次st.nextToken(),在System.out.println中占用了一个额外的令牌。
相反,首先将其保存为String:
String token = st.nextToken();
则可以在打印和数组中使用相同的字符串
http://msdn.microsoft.com/fr-fr/library/aa989865(v=vs.80).aspx
StringTokenizer。nextToken():获取字符串中的下一个token在解析。
numbers[row][col] = st.nextToken();
System.out.println(row + " " + col + " = " + st.nextToken());
你遍历你的令牌而不使用它们!