如何跳过java中的NULL行?

时间:2013-10-20 04:05:41

标签: java readline

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

但是readLine()在完成A,B并且得到错误后停止读取(当读取Blankline时,所有内容都返回NULL并获得出站异常)

.txt文件

一个 乙

C

d ë

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

    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 个答案:

答案 0 :(得分:3)

尝试使用Scanner。这很容易:

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+", "");的内容来运行该行,以确保空白行真正为空,并且没有其他空白字符。

答案 1 :(得分:2)

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

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

也没有'出站异常'之类的东西。您的意思是ArrayIndexOutOfBoundsException?还是NullPointerException?

答案 2 :(得分:1)

是的,这是可能的。但是你的例外不是来自那个。它来自null indexOf()(请参阅您的异常堆栈跟踪,阅读IT,这是您可以跟踪错误的宝贵来源)。您不正确地使用readLine()。这样:

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

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

答案 3 :(得分:1)

由于任何事物都是空的,你不会得到异常。但是由于这条线

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

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

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

while(rd.readLine() != null)

代替。