我的程序需要读取.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);
}
}
答案 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)
代替。