BufferedReader to prosta klasa przeznaczona do efektywnego odczytu ze strumienia podrzędnego. Zasadniczo każde żądanie odczytu złożone z czytnika, takiego jak FileReader, powoduje wysłanie odpowiedniego żądania odczytu do strumienia bazowego. 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. Wydajność ulega znacznej poprawie, jeśli czytnik jest wypaczony w buforze buforowym.
BufferedReader jest zsynchronizowany, więc operacje odczytu na BufferedReader można bezpiecznie wykonywać z wielu wątków.
Z drugiej strony skaner ma o wiele więcej sera; może zrobić wszystko, co może zrobić buforowany czytnik i przy tym samym poziomie wydajności. Jednak dodatkowo skaner może analizować strumień źródłowy dla typów pierwotnych i łańcuchów za pomocą wyrażeń regularnych. Może także tokenizować strumień bazowy za pomocą ogranicznika do wyboru. Może także wykonywać skanowanie do przodu strumienia bazowego z pominięciem ogranicznika!
Jednak skaner nie jest bezpieczny dla wątków, musi być zsynchronizowany zewnętrznie.
Wybór użycia BufferedReader lub Scanner zależy od pisanego kodu, jeśli piszesz prosty czytnik dziennika Czytnik buforowany jest wystarczający. Jeśli jednak piszesz parser XML, bardziej naturalnym wyborem jest skaner.
Nawet podczas odczytywania danych wejściowych, jeśli chcesz zaakceptować dane wprowadzane przez użytkownika wiersz po wierszu i powiedzieć, że po prostu dodaj go do pliku, buforowany czytnik jest wystarczająco dobry. Z drugiej strony, jeśli chcesz zaakceptować dane wejściowe użytkownika jako polecenie z wieloma opcjami, a następnie zamierzasz wykonywać różne operacje w oparciu o określone polecenie i opcje, skaner będzie bardziej odpowiedni.