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ń:
Strumień I / O reprezentuje źródło wejściowe lub miejsce docelowe wyjścia. Strumień może reprezentować wiele różnych rodzajów źródeł i miejsc docelowych, w tym pliki dyskowe, urządzenia, inne programy i tablice pamięci.
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 (odczyt lub zapis bajtów)
- Strumienie znaków (odczyt lub zapis znaków)
- Buforowane strumienie (odczyt z bufora lub zapis do bufora w celu zwiększenia wydajności)
Strumienie bajtów:
Wykonują wejście i wyjście 8-bitowych bajtów. Wszystkie klasy strumienia bajtów pochodzą od InputStream i OutputStream .
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 podklasy
AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream.
OutputStream
- Bezpośrednie znane podklasy
ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream
Strumienie postaci:
Są warstwą nad strumieniami bajtów. Konwertują bajty (dane binarne) na znaki i znaki na bajty, używając kodowania znaków.
Wszystkie klasy strumienia znaków pochodzą od Reader i Writer .
Reader
- Bezpośrednie znane podklasy
BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader
Writer
- Bezpośrednie znane podklasy
BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter
Strumienie bajtów i strumienie znaków używają niebuforowanych operacji we / wy .
Oznacza to, że każde żądanie odczytu lub zapisu jest obsługiwane bezpośrednio przez podstawowy system operacyjny. Może to znacznie obniżyć wydajność programu, ponieważ każde takie żądanie często wyzwala dostęp do dysku, aktywność sieciową lub inną operację, która jest stosunkowo kosztowna. Aby zmniejszyć tego rodzaju obciążenie, platforma Java implementuje buforowane strumienie we / wy.
Buforowane strumienie:
Buforowane strumienie wejściowe odczytują dane z obszaru pamięci zwanego buforem ; natywny wejściowy interfejs API jest wywoływany tylko wtedy, gdy bufor jest pusty.
Podobnie buforowane strumienie wyjściowe zapisują dane w buforze , a natywny wyjściowy interfejs API jest wywoływany tylko wtedy, gdy bufor jest pełny.
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
i BufferedOutputStream
klas.
Aby utworzyć buforowane strumienie znaków, użyj BufferedReader
i BufferedWriter
klas.