2010-10-04 25 views
6

Jedna z linii pliku java, którą próbuję zrozumieć, jest następująca.Odczytywanie pliku przy użyciu skanera Java

return new Scanner(file).useDelimiter("\\Z").next(); 

Oczekuje się, że plik, aby powrócić do września „koniec wejścia ale dla końcowego terminatorem, jeśli w ogóle”, jak na java.util.regex.Pattern dokumentacji. Ale co się dzieje, to zwraca tylko pierwsze 1024 znaki z pliku. Czy jest to ograniczenie narzucone przez szablon matowy regex? Czy można to przezwyciężyć? Obecnie mam zamiar korzystać z filereadera. Ale chciałbym poznać powód takiego zachowania.

+0

NIGDY nie używaj skanera! Naprawdę, dostaniesz tyle kłopotów. –

+8

@Martijn Courteaux - starają się zapewnić choćby najmniejszą wskazówkę, dlaczego skaner jest zły? – whaley

Odpowiedz

2

Spróbuj owijania przedmiotu file w FileInputStream

+0

Czy mógłbyś [edytować] swoją odpowiedź, aby wyjaśnić, dlaczego to pomogłoby i na czym polega problem? W obecnej formie to niewiele więcej niż komentarz. –

5

Ja sam nie mogłem tego odtworzyć. Ale myślę, że mogę rzucić światło na to, co się dzieje.

Wewnętrznie skaner wykorzystuje bufor znaków zawierający 1024 znaki. Skaner odczyta domyślnie z Czytelnego 1024 znaków, jeśli to możliwe, a następnie zastosuje wzór.

Problem tkwi w twoim wzorze ... zawsze będzie dopasowany do końca wejścia, ale to nie będzie oznaczać końca twojego strumienia wejściowego/danych. Kiedy Java zastosuje twój wzorzec do buforowanych danych, spróbuje znaleźć pierwsze wystąpienie końca wejścia. Ponieważ w buforze znajduje się 1024 znaki, dopasowany silnik wywołuje pozycję 1024 w pierwszym dopasowaniu ogranicznika i wszystkiego, zanim zostanie zwrócony jako pierwszy token.

Nie sądzę, że zakotwiczenie końca wejścia jest ważne do użycia w skanerze z tego powodu. W końcu może to być czytanie z nieskończonego strumienia.

+0

Cześć Mark, myślę, że to jest poprawny powód, dla którego skaner nie działa. Głosuję za odpowiedzią. Sposób, aby to działało, to ten, który jest poprawny. Dziękuję za Twoją odpowiedź. – Sharmila

1

Scanner jest przeznaczony do odczytu wielu prymitywów z pliku. To naprawdę nie jest przeznaczone do odczytu całego pliku.

Jeśli nie chcesz dołączyć biblioteki osób trzecich, jesteś lepiej zapętlenie nad BufferedReader że owija FileReader/InputStreamReader dla tekstu lub pętli nad FileInputStream dla danych binarnych.

Jeśli jesteś OK przy użyciu biblioteki innej firmy, Apache commons-io ma FileUtils klasę, która zawiera metody statyczne readFileToString i readLines dla tekstu i readFileToByteArray dla danych binarnych ..

0

Można użyć klasy Scanner tylko określić charset podczas otwierania skaner, tj:

Scanner sc = new Scanner(file, "ISO-8859-1"); 

Java konwertuje bajtów odczytanych z pliku na znaki przy użyciu określonego zestawu znaków, który jest jeden domyślny (od bazowego OS), jeżeli nic nie jest podany (source). Nie jest dla mnie jasne, dlaczego skaner odczytuje tylko 1024 bajty z domyślnym, podczas gdy z drugim osiąga koniec pliku. W każdym razie działa dobrze!

Powiązane problemy