Dziwne działanie klasy Scanner.

0

Korzystając z klasy Scanner próbuje odczytać plik airports.txt mający 9167 7733 wierszy.
Zacząłem od

String fileName = "airports.txt";
Scanner sc = new Scanner(new File(fileName));

Metoda hasNextLine zwróciła true tylko 2536 razy, a metoda nextLine ostatni odczytany wiersz ucięła. Z wiersza

2604,"Senador Nilo Coelho","Petrolina","Brazil","PNZ","SBPL",-9.362411,-40.569097,1263,-`code>odczytała tylko`
2604,"Senador Nilo Coelho","Petrolina","Brazil","PNZ","

Potem eksperymentowałem z charsetem

Scanner sc = new Scanner(new File(fileName),"iso8859-1");
Scanner sc = new Scanner(new File(fileName),"iso8859-2");
Scanner sc = new Scanner(new File(fileName),"utf-8");

odczytuje dobrze.

Scanner sc = new Scanner(new File(fileName),"us-ascii");
Scanner sc = new Scanner(new File(fileName),"cp1250");

odczytuje źle.
Jak to wytłumaczyć, i, co ważniejsze, jak się uchronić przed takim częściowym odczytaniem pliku.

0

Tam jest 7734 linii (wierszy).

A ostatni nextLine() zwrócił:

7734 - 9167,"Puttgarden","Puttgarden","Germany","QUA",\N,54.5,11.2167,0,1,"E"

"7734" to rzeczywista liczba wierszy w pliku a "9167" to "fałszywa" numeracja. Pierwszy niepoprawny przeskok znajduję się w linii 118. W pliku jest oznaczony jako 119 i tak się zwiększa (przeskok) wraz z ilością wierszy.

W skrócie: U mnie działa :D

EDIT: Zerknij na output tutaj: http://imgur.com/a/2KxOP

0

Jaki macie system? Ja mam windows. Możliwe, że domyślny charset dla Linuksa (maca) jest inny niż dla windowsa.
Edit Przerzuciłem program i plik airports.txt na serwer linuksowy i poszło. Po zmianie (na linuksie) charsetu na cp1250 lub us-ascii działa źle.

0

Windows również. Jako drugi argument Scannera podałem różne charsety (iso-2, utf-8). Dla obu działa poprawnie.

0

Jeżeli korzystasz z Eclipse to domyślnie będzie otwierał plik za pomocą charsetu Cp1252 - dowód
Natomiast IntelliJ korzysta (chyba) z domyślnego dla systemu, na którym jest zainstalowany - przesłanka
Może to tutaj tkwi problem.

0

@Burdzi0, użyte IDE nie ma żadnego znaczenia, a charset, który pokazałeś dotyczy plików źródłowych.
Programów nie uruchamia się w IDE. Program utworzony w IntelliJ, uruchomiony poza tym środowiskiem, działa źle, uruchomiony w InelliJ działa dobrze.
Problemem jest co innego, dlaczego zmiana charsetu wpływa na działanie metod hasNextLine oraz nextLine?
Plik airports.txt:
dla charsetów iso8859-1, iso8859-2 i utf-8 odczytywany jest cały (7133 wierszy),
dla charsetu cp1250 odczytywanych jest 2536 wierszy (ostatni wiersz częściowo),
dla charsetu cp1252 odczytywanych jest 4728 wierszy (z wiersza 4728 tylko jeden znak).

0

@bogdans Widzisz, bo nie napisałeś wcześniej, że poza IDE działa źle (albo ja nie sprawdziłem). Wyszedłem z założenia, że autor nie próbował uruchomić programu poza IDE i możliwe, że to właśnie ono było przyczyną błędu. I to chyba dobrze, że dotyczy plików źródłowych bo chyba z takim mamy doczynienia :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1