2013-10-20 2 views
1

Моя программа должна прочитать .txt-файл и сохранить его в Arraylist.Как пропустить строку NULL в java?

Но ReadLine() Остановка чтения после окончания A, B, и получил ошибку (при чтении Blankline все возвращают NULL и получил исходящую исключение)

.txt файл

B

C

D E

ли его можно читать, пропуская пустой линии, прочитайте еще раз, определите пробел и пропустите его снова .......

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); 
    } 
} 
+8

nitpick: Строка, которая является «null», не является той же строкой, что и пустая строка. –

ответ

1

Да, это возможно. Но ваше Исключение не исходит из этого. Это от нуля применяется indexOf() (см. Трассировку стека исключений, READ IT, это ценный источник, где вы можете отслеживать свои ошибки). Вы неправильно используете readLine(). Это:

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

будет выбрасывать каждую нечетную линию. Вы НЕ МОЖЕТЕ проверить нуль, вызывая readLine(). Вместо этого вы должны позвонить readLine() только один раз в цикле и проверить его значение RETURN VALUE для null. И только если это не null, вы должны продолжить обработку.

+0

Что означает «будет читать буфер ввода-вывода»? – EJP

+0

@EJP: Я имею в виду, он не просто проверит, какая будет следующая строка, как AFAIU, что ожидает OP, но и прочитал ее. – LeleDumbo

+0

Другими словами, вы имеете в виду, что он выбросит линию? В вашем ответе это не сказано. Все I/O 'считывает буфер ввода/вывода', поскольку это означает что-либо вообще. – EJP

1

Вы не получаете исключение из-за чего-либо, являющегося нулевым. Но из-за этой линии

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

, как, myLine.indexOf("->",0) возвращает -1, так подстроки метод бросает исключение. Измените этот код, чтобы он работал.

и не использовать while (true), он будет находиться во включенном цикле навсегда. использование

while(rd.readLine() != null) 

вместо этого.

+0

Все, что достигается, - это выбросить каждую строку с нечетным номером и на самом деле не решить проблему. – EJP

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+", "");, чтобы пустые строки действительно были пустыми и не имели других пробельных символов.

2

В Java нет нулевой строки. Если readLine() возвращает null, это означает конец потока, который вы должны проверять каждый раз, когда вы его вызываете, и если вы закроете поток и прекратите чтение. Ваша петля должна выглядеть так:

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

Не существует такой вещи, как «исходящее исключение». Возможно, вы имели в виду ArrayIndexOutOfBoundsException? или NullPointerException?

Смежные вопросы