O ile wiem, dwie najczęstsze metody odczytu danych znakowych z pliku w Javie to Scanner
lub BufferedReader
. Wiem również, że BufferedReader
odczytuje pliki skutecznie, używając bufora, aby uniknąć operacji na dysku fizycznym.
Moje pytania to:
- Czy
Scanner
działa równie dobrzeBufferedReader
? - Dlaczego miałbyś wybierać
Scanner
naBufferedReader
odwrót?
java
file-io
java.util.scanner
bufferedreader
Mads Mobæk
źródło
źródło
Odpowiedzi:
Scanner
służy do analizowania tokenów z zawartości strumienia, podczas gdyBufferedReader
po prostu odczytuje strumień i nie wykonuje żadnej specjalnej analizy.W rzeczywistości można przejść
BufferedReader
doscanner
jako źródło znaków do analizowania.źródło
Scanner
ostatecznie zależy od czegoś innego, co może być zsynchronizowane.W najnowszej wersji / kompilacji JDK6 (b27),
Scanner
ma mniejszy bufor ( 1024 znaki ) w przeciwieństwie doBufferedReader
( 8192 znaków ), ale jest więcej niż wystarczający.Jeśli chodzi o wybór, użyj
Scanner
jeśli chcesz przeanalizować plik, użyjBufferedReader
jeśli chcesz odczytać plik linia po linii. Zobacz także tekst wprowadzający ich wcześniej wymienionych dokumentacji API.nextXxx()
metody wScanner
klasie.źródło
readInt();
readFloat (); itd. Teraz rozumiem, co to znaczy parsowanie. i BalusC, czy możesz dać mi mało czasu tylko 10 minut na czacie, chcę zapytać trochę o buforowane, jak to działa.BufferedReader
w konstruktorze skanera? czy to dobry pomysł?Scanner
Bufor zostanie rozszerzony w razie potrzeby do dopasowania wzorca. Więc jeśli chcesz większego bufora, musisz tylko wywołać, np.findWithinHorizon("\\z", 8192)
Na nim, a potem użyje bufora o pojemności8192
znaków (lub całego pliku, jeśli jest mniejszy).Zobacz ten link , stąd zacytowano:
źródło
BufferedReader
ma znacznie większą pamięć bufora niż skaner. Użyj,BufferedReader
jeśli chcesz uzyskać długie ciągi ze strumienia, i użyj,Scanner
jeśli chcesz przeanalizować określony typ tokena ze strumienia.Scanner
może używać tokenize przy użyciu niestandardowego ogranicznika i analizować strumień w prymitywne typy danych, a jednocześnieBufferedReader
może tylko czytać i przechowywać ciąg.BufferedReader
jest synchroniczny, podczas gdyScanner
nie jest. Użyj,BufferedReader
jeśli pracujesz z wieloma wątkami.Scanner
ukrywa wyjątek IOException iBufferedReader
natychmiast go wyrzuca.źródło
Sugeruję używać
BufferedReader
do czytania tekstu.Scanner
chowa sięIOException
,BufferedReader
rzucając go natychmiast.źródło
Różnice między BufferedReader i Scanner są następujące:
Kod do odczytu linii z konsoli:
BufferedReader :
Skaner :
źródło
Poniżej przedstawiono różnice między BufferedReader i Scanner
Dzięki
źródło
Główne różnice:
Przykład
wypisuje następujące dane wyjściowe:
Ten sam wynik można wygenerować za pomocą tego kodu, który używa wyrażenia regularnego do analizy wszystkich czterech tokenów jednocześnie:
BufferedReader:
Odczytuje tekst ze strumienia wprowadzania znaków, buforując znaki, aby zapewnić efektywny odczyt znaków, tablic i linii.
Można określić rozmiar bufora lub użyć rozmiaru domyślnego. Wartość domyślna jest wystarczająco duża dla większości celów.
Zasadniczo każde żądanie odczytu złożone z czytnika powoduje wysłanie odpowiedniego żądania odczytu z podstawowego strumienia znaków lub bajtów. Dlatego wskazane jest, aby owinąć BufferedReader wokół dowolnego czytnika, którego operacje read () mogą być kosztowne, takie jak FileReaders i InputStreamReaders. Na przykład,
buforuje dane wejściowe z określonego pliku. Bez buforowania każde wywołanie read () lub readLine () może spowodować odczyt bajtów z pliku, konwersję na znaki, a następnie zwrócenie, co może być bardzo nieefektywne. Programy wykorzystujące DataInputStreams do wprowadzania tekstu można zlokalizować, zastępując każdy DataInputStream odpowiednim BufferedReader.
Źródło: Link
źródło
Istnieją różne sposoby przyjmowania danych wejściowych w Javie, takie jak:
1) BufferedReader 2) Scanner 3) Argumenty wiersza poleceń
BufferedReader Odczytuje tekst ze strumienia wprowadzania znaków, buforuje znaki, aby zapewnić efektywny odczyt znaków, tablic i linii.
Gdzie skaner to prosty skaner tekstowy, który może analizować prymitywne typy i ciągi znaków przy użyciu wyrażeń regularnych.
jeśli piszesz prosty czytnik dziennika Czytnik buforowany jest wystarczający. jeśli piszesz parser XML Skaner jest bardziej naturalnym wyborem.
Aby uzyskać więcej informacji, zapoznaj się z:
http://java.meritcampus.com/t/240/Bufferedreader?tc=mm69
źródło
Poniższa odpowiedź pochodzi z Reading from Console: JAVA Scanner vs BufferedReader
Po odczytaniu danych wejściowych z konsoli istnieją dwie opcje, aby to osiągnąć. Pierwsze użycie
Scanner
, kolejne użycieBufferedReader
. Oba mają różne cechy. Oznacza różnice w sposobie korzystania z niego.Skaner traktował dane wejściowe jako token. BufferedReader po prostu odczytuje wiersz po wierszu podany sygnał wejściowy jako ciąg znaków. Skaner sam zapewnia możliwości analizowania, tak jak nextInt (), nextFloat ().
Ale jakie są inne różnice?
Skaner jest dostarczany od wersji JDK 1.5 wyższej.
Kiedy należy korzystać ze skanera lub buforowanego czytnika?
Spójrz na główne różnice między nimi, jedna za pomocą tokena, druga za pomocą linii strumienia. Jeśli potrzebujesz możliwości analizowania, użyj skanera. Ale czuję się bardziej komfortowo z BufferedReader. Kiedy musisz czytać z pliku, użyj BufferedReader, ponieważ używa bufora podczas odczytu pliku. Lub możesz użyć BufferedReader jako danych wejściowych do skanera.
źródło
BufferedReader prawdopodobnie zapewni lepszą wydajność (ponieważ skaner jest oparty na InputStreamReader, patrz źródła).ups, do odczytu z plików używa nio. Kiedy testowałem wydajność nio w porównaniu z wydajnością BufferedReader dla dużych plików, nio pokazuje nieco lepszą wydajność.źródło
Wolę,
Scanner
ponieważ nie zgłasza sprawdzonych wyjątków, a zatem jego użycie skutkuje bardziej usprawnionym kodem.źródło