1

我的程序需要读取 .txt 文件并将其存储到 Arraylist 中。

但是 readLine() 完成 A , B 后停止读取,并得到错误(读​​取空白行时,所有内容都返回 NULL 并出现出站异常)

.txt 文件

甲乙

C

是否可以阅读,跳过空白行,再次阅读,检测空白行并再次跳过它......

    public static void loadData(){
    try{
        BufferedReader rd = new BufferedReader (new FileReader("/Users/Homura/Documents/newWorkspace/DataStructures/src/flights.txt"));

    while(true){

        String myLine = rd.readLine();
        String fName = myLine.substring(0,myLine.indexOf("->",0));
        String toName = myLine.substring(myLine.indexOf("->")+3);

        if(!myMap.containsKey(fName)){
           ArrayList<String> myArray = new ArrayList<String>();
           myMap.put(fName,myArray); 
        }
        myMap.get(fName).add(toName);
        allPlaces.add(fName);

        if(rd.readLine()== null) { myLine = rd.readLine();
       }
    }
    }

    catch(IOException ex){
        throw new ErrorException(ex);
    }
}
4

4 回答 4

3

尝试使用扫描仪。这要容易得多:

Scanner scanner = new Scanner(new File("/Users/Homura/Documents/newWorkspace/DataStructures/src/flights.txt");
while (scanner.hasNextLine()) {
  String line = scanner.nextLine();
  if (!line.equals("")) {
    //do stuff with the line since it isn't blank
}

这样你就可以一直读到文件的结尾,而且你只做那些非空白行的东西。

您可能还需要考虑通过某种方式运行该行,line.replaceAll("\\s+", "");以确保空白行是真正的空白并且没有其他空白字符。

于 2013-10-20T04:19:41.023 回答
2

Java 中没有“空行”。如果readLine()返回null,则表示流结束,每次调用时都必须检查它,如果得到它,则关闭流并停止读取。您的循环应如下所示:

while ((line = in.readLine()) != null)
{
    // ...
}
in.close();

也没有“出站异常”之类的东西。你是说ArrayIndexOutOfBoundsException?还是NullPointerException?

于 2013-10-20T04:20:57.407 回答
1

由于任何内容为空,您都不会遇到异常。但是因为这条线

String fName = myLine.substring(0,myLine.indexOf("->",0));

因为,myLine.indexOf("->",0)返回 -1,所以 substring 方法抛出异常。修改此代码以使其正常工作。

并且不要使用 while(true),它将永远处于 while 循环中。利用

while(rd.readLine() != null)

反而。

于 2013-10-20T04:18:00.923 回答
1

是的,这是可能的。但是您的异常并非来自于此。它来自被应用的 null indexOf()(请参阅您的异常堆栈跟踪,阅读它,这是一个有价值的来源,您可以在其中跟踪您的错误)。你使用readLine()不当。这个:

if(rd.readLine()== null) { myLine = rd.readLine();
}

将丢弃每一条奇数行。您不能通过调用来检查 null readLine()。相反,您应该readLine()只在循环中调用一次并检查其返回值是否为空。只有当它不为空时,你才应该做进一步的处理。

于 2013-10-20T04:12:03.293 回答