我正在编写一个java代码,它从列中读取文件中的文本,但是当尝试运行代码时,出现了一个超出界限的错误。仅当我尝试使用命令时才会发生这种情况:arr [1](或更高的索引)。奇怪的是,以下代码工作正常:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ReadingColumns {
public static void run(){
BufferedReader br = null;
String[] characters = new String[10000];
try {
String sCurrentLine;
br = new BufferedReader(new FileReader("C:\\Users\\wyn_005 trans.tif.txt"));
int i=0;
while ((sCurrentLine = br.readLine()) != null) {
String[] arr = sCurrentLine.split("\\t");
for(int j=0;j<arr.length;j++){
System.out.println(arr[j]);
}
// System.out.println(sCurrentLine);
// System.out.println("arr[0] = " + arr[0]);
// System.out.println(arr[2]);
i++;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}}
` 循环工作正常(整个行一个元素一个,然后下一个循环迭代中的下一行,依此类推)如果我尝试使用arr [0]输入它也没关系,但只给出了第一列。
`System.out.println(sCurrentLine)`
给出了整个文件,所以我知道它没有遗漏任何东西。
该文件看起来或多或少像这样:
Frame X1 Y1 Marker1 R1 X2 Y2 Marker2 R2...
Data from 1 to 20
1 1.0 2.0 3.2 4.0 3.1 * 5.5
2 3.3 1.2 4.1 1.1 2.1 1.3
...
(抱歉,我不知道如何在此处用制表符分隔列,因此它是用空格制作的。) 谁能告诉我为什么会这样?我对java很新,所以也许我错过了一些简单的东西。
编辑: 取消注释行System.out.println(arr [2])时抛出异常; 的System.out.println(arr.length);每次迭代都会给出133。
答案 0 :(得分:0)
你在选项卡上分裂。如果arr [1],但arr [0]有效,则sCurrentLine不包含选项卡。如果你正在使用
for(int j=0;j<arr.length;j++){
然后在循环内你不应该使用任何&gt; arr.length,在这个错误的情况下,是1.所以你可以安全地使用arr [j],但你不能随意使用任何arr [number],除非你确认该数字在范围内(0,arr.length)。 / p>
答案 1 :(得分:0)
您的文件可能不包含制表符,但可以包含4个空格来缩进列。这就是为什么按选项卡字符拆分会给出大小为1的数组。尝试拆分此模式:
sCurrentLine.split("\\s+");
此模式包括空格和制表符。