Dlaczego BufferedReader
Odczyt buforowany a niebuforowany
Dlaczego BufferedReader to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.
Odczytywanie danych wejściowych w Javie
Większość rzeczywistych programów potrzebuje danych wejściowych od użytkownika: imienia, liczby lub polecenia. Java udostępnia kilka sposobów odczytywania danych wejściowych, ale jednym z najczęściej używanych i wydajnych jest BufferedReader.
W tej lekcji dowiedzą się Państwo, dlaczego istnieje BufferedReader i kiedy warto go użyć.
Skąd pochodzą dane wejściowe
Gdy wpisują Państwo tekst w konsoli, przepływa on przez System.in. Jest to niskopoziomowy strumień bajtów — udostępnia surowe bajty, a nie wygodny w użyciu tekst.
Aby zamienić te bajty na czytelne znaki i całe wiersze, opakowujemy System.in w klasy pomocnicze. BufferedReader jest klasą opakowującą, która to ułatwia.
Co oznacza „Buffered”
Odczytywanie pojedynczego bajtu z klawiatury lub pliku jest powolne. Bufor to fragment pamięci, który przechowuje wiele znaków naraz.
BufferedReader zapełnia ten bufor dużymi porcjami, a następnie szybko przekazuje dane. Mniejsza liczba odwołań do bazowego strumienia oznacza lepszą wydajność, szczególnie w przypadku dużej ilości danych wejściowych.
Konfiguracja dwuwarstwowa
BufferedReader nie może bezpośrednio odczytywać danych z System.in, ponieważ ten strumień dostarcza bajty. Najpierw opakowujemy go w InputStreamReader, który konwertuje bajty na znaki.
System.in→ bajtyInputStreamReader→ znakiBufferedReader→ buforowane wiersze
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);Klasyczny zapis w jednej linii
Dokładnie tę linię można znaleźć niemal w każdym programie Java, który odczytuje dane z konsoli. Łączy ona obie klasy opakowujące w jednym wyrażeniu.
Warto pamiętać: wewnętrzny InputStreamReader obsługuje konwersję bajtów na znaki, a zewnętrzny BufferedReader dodaje buforowanie oraz wygodną metodę readLine().
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));Wymagane importy
Te klasy znajdują się w pakiecie java.io, dlatego należy zaimportować je na początku pliku.
Odczytywanie danych wejściowych może się nie powieść, więc metody zgłaszają IOException — ten wyjątek również należy zaimportować lub obsłużyć, czym zajmiemy się później.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;BufferedReader a Scanner
Początkujący często najpierw poznają Scanner. Jest on wygodniejszy (może bezpośrednio parsować liczby), ale wolniejszy.
- Scanner: łatwe parsowanie, większy narzut.
- BufferedReader: większa szybkość, odczyt całych wierszy, ale liczby trzeba parsować samodzielnie.
W przypadku dużej ilości danych wejściowych lub programowania konkursowego BufferedReader zapewnia większą szybkość.
Odczytywanie całego wiersza
Najważniejszą metodą jest readLine(). Odczytuje ona wszystko, co użytkownik wpisze do momentu naciśnięcia klawisza Enter, i zwraca to jako String (bez znaku nowej linii).
Jeśli nie ma więcej danych wejściowych, readLine() zwraca null. Zajmiemy się tym w następnej lekcji.
String name = br.readLine();
System.out.println("Hello, " + name);Kompletny program odczytujący dane
Oto kompletny program. Odczytuje jeden wiersz i wita użytkownika. Proszę zwrócić uwagę na throws IOException w metodzie main — podczas nauki jest to szybki sposób na przekazanie błędów wejścia wyżej.
Ten fragment czeka na dane wprowadzane z klawiatury, dlatego nie można go tutaj uruchomić automatycznie, ale jest poprawnym kodem Java.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
String name = br.readLine();
System.out.println("Hi " + name);
}
}Do potwierdzenia działania nie są potrzebne dane wejściowe
Aby zobaczyć, że klasy opakowujące istnieją i można je skompilować, przedstawiamy działającą wersję, która niczego nie odczytuje — jedynie potwierdza utworzenie obiektu.
W rzeczywistej aplikacji wywołaliby Państwo readLine(), ale ta wersja wyświetla komunikat, dzięki czemu można ją uruchomić od razu.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
System.out.println("BufferedReader is ready!");
}
}Kiedy używać BufferedReader
Warto użyć BufferedReader, gdy:
- odczytują Państwo wiele wierszy lub duże pliki,
- zależy Państwu na szybkości,
- potrzebują Państwo prostego odczytu tekstu wiersz po wierszu.
Proszę użyć Scanner, gdy potrzebne jest szybkie parsowanie liczb, a ilość danych wejściowych jest niewielka. Oba rozwiązania są poprawne — należy wybrać odpowiednie narzędzie.
Szybkie sprawdzenie
Sprawdźmy, czy rozumieją Państwo konfigurację BufferedReader.
Podsumowanie
Dowiedzieli się Państwo, że System.in jest strumieniem bajtów opakowanym najpierw przez InputStreamReader (bajty na znaki), a następnie przez BufferedReader (buforowanie oraz readLine()).
Buforowanie zwiększa wydajność, a BufferedReader sprawdza się szczególnie dobrze przy dużej ilości danych wejściowych lub danych podzielonych na wiersze. Następnie: szczegółowe omówienie odczytywania wierszy.
Często zadawane pytania
Czy lekcja „Dlaczego BufferedReader” jest bezpłatna?
Tak — pełny tekst „Dlaczego BufferedReader” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Dlaczego BufferedReader”?
Odczyt buforowany a niebuforowany Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Java Academy?
Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Dlaczego BufferedReader”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?
Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Dlaczego BufferedReader
- Odczytywanie wierszy
- Parsowanie liczb z danych wejściowych
- Bezpieczne zamykanie strumieni