/ / Pętla nieskończona podczas odczytu pliku i String.split () nie działa poprawnie - java, string, pętle, file-io, split

Nieskończona pętla podczas odczytu pliku i String.split () nie działa poprawnie - java, string, loop, file-io, split

Mam plik tekstowy admin.dat który wygląda tak:

blackranger|sdasdasdasd23123|1000
blueranger|sdasdasdasdwhhh22|1000
brownranger|lppsadospd123|1000

Staram się czytać każdą linię, używając | jako mój separator i wysyłanie do konsoli każdej sekcji.

Kod:

package testing;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;

public class Testing {
public static void main(String[] args) {
Scanner filereader = null;
try {
filereader = new Scanner(new File("./src/testing/players.dat"));
String data;
while(filereader.hasNextLine()) {
String foo = "abc|123|a213";
String[] bar = foo.split("|");
for (int i = 0; i < 3; i++) {
System.out.println(bar[i]);
}
}
} catch (FileNotFoundException e) {
System.out.println("File not found");
} catch (IOException e) {
System.out.println("Error while reading file");
} finally {
if (filereader != null) {
filereader.close();
}
}
}
}

Spodziewany rezultat:

blackranger
sdasdasdasd23123
1000
blueranger
sdasdasdasdwhhh22
1000
brownranger
lppsadosph123
1000

Rzeczywisty wynik:

a // infinite loop
b


a
b


a
b


a
b



a
b

Dlaczego dostaję nieskończoną pętlę, która się drukuje a b na zawsze?

Odpowiedzi:

4 dla odpowiedzi № 1

Nigdy nie czytasz z fileReadera wewnątrz pętli while, więc while(filereader.hasNextLine()) będzie zawsze być prawdą i ma sens, że pętla nigdy się nie skończy. Zaskoczyło mnie to, że wyglądało na to, że masz kod, który czytał plik fileReader wewnątrz pętli, ale go skomentował. Dlaczego?

Rozwiązanie: nie rób tego. Pamiętaj, aby zmienić warunki testu w pętli while, w przeciwnym razie pętla while nigdy się nie skończy.


5 dla odpowiedzi nr 2

Powinieneś uciec postaci | ponieważ ma specjalne znaczenie w regex

 foo.split("\|");

Ale najpierw przydziel foo z wartością odczytaną z pliku, a nie zapisaną na stałe:

String foo = filereader.nextLine();

2 dla odpowiedzi nr 3
String foo = filereader.nextLine();
String[] bar = foo.split("\|");

zamiast

 String foo = "abc|123|a213";
String[] bar = foo.split("|");