Głodny(-a) wiedzy na temat Javy ☕? Przed Tobą następny artykuł powstały z konieczności podzielenia już powstałego materiału na mniejsze części 🧩. Temat będzie rozpoczęty temat odczytu z pliku tekstowego w języku Java, a klasa "BufferedReader" jeszcze bardziej uprzyjemni ten proces! Wchodź do środka po więcej informacji 😄!
"BUFFEREDREADER" W JĘZYKU JAVA JAKO KOLEJNY KROK W STRONĘ ODCZYTU
Nazwa na dzień dobry sugeruje, że mamy do czynienia z wejściem buforowanym. Istotnie, wykorzystuje bufor do składowania odczytywanych danych. W praktyce, pozwala to na odczytywanie nie znak po znaku, tylko już całego wiersza 😇! To jest duży plus tej klasy. Ponadto, tak samo jak przy "BufferedWriter", bufor efektywnie redukuje liczbę operacji - zamiast znak po znaku, dopiero wtedy gdy bufor wyczerpie swoją pojemność ♻️.
Konstruktor klasy "BufferedReader" wymaga podania w parametrze instancji typu "Reader", czyli dla przykładu "FileReader" (bo klasa "FileReader" JEST klasą "Reader" wg relacji "JEST"):
BufferedReader bufferedReader = new BufferedReader(new FileReader("file.txt"));
i naturalnie obejmujemy to obsługą wyjątków, bo operacje na plikach są ryzykowne (może nie zostać odnaleziony, brak uprawnień do odczytu itd.):
try {
BufferedReader bufferedReader = new BufferedReader(new FileReader("test.txt"));
bufferedReader.close();
} catch (Exception exception) {
exception.printStackTrace();
}
Uczulam ponownie na metodę "close" - kiedy zdefiniujesz sobie jakiś strumień, od razu dodawaj to wywołanie, bo potem łatwo zapomnieć 🙄...
"BUFFEREDREADER" VERSUS "FILEREADER"
"BufferedReader" w języku Java wspiera odczytywanie całego pojedynczego wiersza, także metoda "readLine" to wszystko co najistotniejsze, co musisz wiedzieć po tym artykule 👍. Rozpatrzmy dwie wersje aplikacji odczytujących zawartość z podanego pliku przy użyciu pętli "while":
"FILEREADER"
try {
File file = new File("test.txt");
FileReader fileReader = new FileReader(file);
int character;
while ((character = fileReader.read()) != -1) {
System.out.print\(character);
}
fileReader.close();
} catch (Exception exception) {
exception.printStackTrace();
}
Na tym przykładzie widzimy dwa charakterystyczne elementy. Po pierwsze, możemy odczytywać jedynie pojedyncze znaki (metoda "read"), a po drugie, celem otrzymania znaku na danej pozycji, musimy rzutować typ "int" na typ "char".
"BUFFEREDREADER"
try {
BufferedReader bufferedReader = new BufferedReader(new FileReader("test.txt"));
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
bufferedReader.close();
} catch (Exception exception) {
exception.printStackTrace();
}
Tu widać gołym okiem jak podnosi się wygoda 😊. Metoda "readLine" pobiera jeden wiersz i przypisuje go jako typ "String" (zwraca "null", jeżeli doszedł do końca tzw. EOF, "end of line"). Żadne rzutowanie już nie jest potrzebne - drugi punkt dla "BufferedReader" w języku Java ✅.
Jeżeli czytałeś(-aś) artykuł o łańcuchowym typie danych i o klasie "StringBuilder", to już wiesz, że powyższy przykład może być narażony na marnowanie pamięci z powodu każdorazowego przypisywania nowego łańcucha tej samej zmiennej. Żeby temu zapobiec, można zapisać tak:
while (true) {
String line = bufferedReader.readLine();
if(line == null) {
break;
}
System.out.println(line);
}
Choć zapis samej pętli dużo bardziej zagmatwany 😁.
"BufferedReader" w języku Java podnosi wygodę i abstrakcję operacji odczytu z podanego pliku wykorzystując do tego bufor, który daje zdolność do pobierania całego wiersza z danymi bez konieczności jakiegokolwiek rzutowania.
Koniec. Co więcej można napisać? Korzystaj z "BufferedReader" - zrobi to samo prościej i efektywniej 😁!