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 № 1Nigdy 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("|");