Java ma dwa rodzaje klas wejścia i wyjścia (I / O): strumienie i czytniki / pisarze .
(Strumienie InputStream
, OutputStream
i wszystko, co rozszerza te) są do odczytywania i zapisywania danych binarnych plików z sieci, czy cokolwiek innego urządzenia.
Czytelnicy i pisarze są do czytania i pisania tekstu (znaków). Są warstwą na wierzchu strumieni, która konwertuje dane binarne (bajty) na znaki iz powrotem, przy użyciu kodowania znaków .
Odczytywanie danych z dysku bajt po bajcie jest bardzo nieefektywne. Jednym ze sposobów na przyspieszenie jest użycie bufora: zamiast czytać jeden bajt na raz, czytasz kilka tysięcy bajtów na raz i umieszczasz je w buforze w pamięci. Następnie możesz po kolei spojrzeć na bajty w buforze.
Samouczek Oracle dotyczący I / O w języku Java wyjaśnia to szczegółowo.
Patrząc na podany wiersz kodu:
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.in
jest InputStream
. Tworzysz plik, InputStreamReader
który czyta bajty z System.in
. Następnie zawijasz to w plik BufferedReader
.
Więc w końcu masz, BufferedReader
który czyta z, InputStreamReader
który czyta System.in
.
InputStreamReader
to opakowanie wokół elementu,InputStream
które umożliwia czytanie tekstu z plikuInputStream
. Jeśli chcesz czytać tylko bajty (nie znaki), nie potrzebujeszInputStreamReader
. Jest to przydatne, jeśli chcesz interpretować bajty jako znaki tekstowe.Bufor:
Jest to obszar pamięci fizycznej służący do tymczasowego przechowywania danych podczas przenoszenia ich z jednego miejsca do drugiego. W większości przypadków fizyczną pamięcią byłaby to pamięć RAM (pamięć o dostępie swobodnym).
Ale z kontekstu tego pytania, bufor jest używany podczas odczytu / zapisu danych. Nie trzeba go używać podczas przenoszenia danych z jednego miejsca do drugiego.
Przykład bufora: Jeśli twój system ma 4 GB pamięci RAM, 4 KB pamięci (RAM) może zostać przydzielone do bufora przez system. KB - kilobajt (y), GB - gigabajt (y)
Strumień I / O (lub) Strumień:
I / O oznacza wejście / wyjście.
Tak więc strumień wejściowy może być źródłem wejściowym, takim jak plik dyskowy, połączenie sieciowe itp.
Strumień wyjściowy może być miejscem docelowym, takim jak plik dyskowy, połączenie sieciowe itp.
Zgodnie z oficjalną dokumentacją JAVA , strumienie dzielą się na 3 typy.
Strumienie bajtów:
Klasy Byte Input Stream uzyskują dane wejściowe jako nieprzetworzone bajty . Klasy Byte Output Stream dają dane wyjściowe jako nieprzetworzone bajty .
InputStream
- Bezpośrednie znane podklasyOutputStream
- Bezpośrednie znane podklasyStrumienie postaci: Są warstwą nad strumieniami bajtów. Konwertują bajty (dane binarne) na znaki i znaki na bajty, używając kodowania znaków.
Reader
- Bezpośrednie znane podklasyWriter
- Bezpośrednie znane podklasyStrumienie bajtów i strumienie znaków używają niebuforowanych operacji we / wy .
Buforowane strumienie:
Program może konwertować niebuforowany strumień na buforowany strumień przy użyciu idiomu zawijania, w którym niebuforowany obiekt strumienia jest przekazywany do konstruktora dla klasy buforowanego strumienia.
Przykład:
inputStream = new BufferedReader(new FileReader("xanadu.txt")); outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));
Istnieją 4 klasy buforowanych strumieni, które są używane do zawijania niebuforowanych strumieni:
Aby utworzyć buforowane strumienie bajtów, użyj
BufferedInputStream
iBufferedOutputStream
klas.Aby utworzyć buforowane strumienie znaków, użyj
BufferedReader
iBufferedWriter
klas.źródło
Cóż, jest to pytanie dla każdego, kto zacznie pracować nad pakietem java.io. Aby odpowiedzieć na twoje pytanie, InputStreamReader i BufferedReader reprezentują tylko obiekty Java (nie ma w nich nic specjalnego), ale są tworzone dla operacji io, takich jak odczyt i zapis z / do różnych wejść / wyjść, takich jak plik, obiekt itp.
A teraz przejdźmy do kolejki
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
InputStreamReader to klasa do odczytu strumienia wejściowego bajtów, ale odczytanie każdego bajtu jest kosztowną operacją, więc owijamy go wokół BufferedReader, aby był buforowany (co jest wzorcem dekoratora)
Więc to, co się stanie, to jeszcze zanim zaczniesz czytać, bufferedReader zapisze kawałek bajtów w rejestrze i kiedy wykonasz operację odczytu. zostanie odczytany z tej lokalizacji, która jest znacznie tańsza niż odczyt z konsoli / pliku Ale w przypadku InputStreamReader, gdy wykonujesz operację odczytu za każdym razem, gdy ma miejsce operacja dostępu do dysku
źródło
Strumień to połączenie i rzeczywiste informacje przesyłane między punktami. Bufor to pojemnik do przechowywania, który przechowuje część lub całość przesyłanych strumieniowo danych i przekazuje je do urządzenia wyjściowego.
Oczywiście chodzi o to, że jeśli strumień zwalnia powyżej szybkości transmisji danych wymaganej do wyświetlenia danych, wyjście zatrzymywałoby się. Bufor zapobiega temu.
źródło
stream
pakiety. Następnie komputer zdalny przechowuje każdy pakiet w buforze. Komputer zdalny odczytuje dane ze swojego bufora i tworzy, powiedzmy, wideo z tego. Mam nadzieję, że to pomoże!Bufor to część pamięci używana do przechowywania strumienia danych z urządzeń peryferyjnych. Następnie z tego bufora ten strumień danych jest zbierany i przechowywany w zmiennych. Strumień można zdefiniować jako ciągły przepływ danych.
Samo określenie „wejście / wyjście” oznacza nic innego jak przenoszenie danych do i z buforów. Po prostu miej to cały czas w pamięci. Procesy wykonują operacje we / wy, żądając od systemu operacyjnego, aby dane zostały usunięte z bufora (operacja zapisu) lub aby bufor został wypełniony danymi (operacja odczytu).
Schemat logiczny ruchu danych
Upraszczając, wyobraź sobie, że kiedy wpisujesz dane na klawiaturze, dane są przesyłane przez potok ( strumień ) do bufora, a następnie z bufora na dysk (operacja zapisu). Podobnie, gdy dane są przenoszone z dysku do bufora iz bufora na konsolę, jest to operacja odczytu.
Możesz przeczytać linki, aby lepiej zrozumieć. Mam nadzieję, że to pomoże!.
Co to jest bufor w Javie
wprowadź opis linku tutaj
źródło