Đệm:
Nó là một vùng của bộ nhớ vật lý được sử dụng để lưu trữ tạm thời dữ liệu trong khi nó đang được di chuyển từ nơi này sang nơi khác. Đó là bộ nhớ lưu trữ vật lý sẽ là RAM (ram) trong hầu hết các trường hợp.
Nhưng từ ngữ cảnh của câu hỏi này, Buffer được sử dụng trong khi đọc / ghi dữ liệu. Nó không cần được sử dụng trong khi di chuyển dữ liệu từ nơi này sang nơi khác.
Ví dụ cho bộ đệm: Nếu hệ thống của bạn có 4 GB RAM, 4 KB bộ nhớ (RAM) có thể được hệ thống cấp phát cho Bộ đệm . KB - Kilobyte (s), GB - Gigabyte (s)
Luồng I / O (hoặc) Luồng:
I / O Stream đại diện cho một nguồn đầu vào hoặc một điểm đến đầu ra. Một luồng có thể đại diện cho nhiều loại nguồn và đích khác nhau, bao gồm tệp đĩa, thiết bị, chương trình khác và mảng bộ nhớ.
I / O có nghĩa là Đầu vào / Đầu ra.
Vì vậy, Input Stream có thể là một nguồn đầu vào như tệp đĩa, kết nối mạng, v.v.
Và, Dòng đầu ra có thể là đích đầu ra như tệp đĩa, kết nối mạng, v.v.
Theo tài liệu chính thức của JAVA , Luồng có 3 loại.
- Luồng Byte (đọc hoặc ghi byte)
- Dòng ký tự (đọc hoặc ghi ký tự)
- Luồng được đệm (đọc từ hoặc ghi vào Bộ đệm để đạt hiệu quả)
Luồng Byte:
Chúng thực hiện đầu vào và đầu ra của byte 8-bit. Tất cả các lớp luồng byte được giảm xuống từ InputStream và OutputStream .
Các lớp Byte Input Stream nhận đầu vào dưới dạng byte thô . Các lớp Luồng đầu ra Byte cho đầu ra dưới dạng các byte thô .
InputStream
- Các lớp con đã biết trực tiếp
AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream.
OutputStream
- Các lớp con đã biết trực tiếp
ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream
Luồng ký tự:
Chúng là một lớp nằm trên Luồng Byte. Chúng chuyển đổi byte (dữ liệu nhị phân) thành ký tự và ký tự thành byte, sử dụng mã hóa ký tự.
Tất cả các lớp dòng ký tự đều có nguồn gốc từ Reader và Writer .
Reader
- Các lớp con đã biết trực tiếp
BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader
Writer
- Các lớp con đã biết trực tiếp
BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter
Luồng Byte & Luồng ký tự sử dụng I / O không có bộ đệm .
Điều này có nghĩa là mỗi yêu cầu đọc hoặc ghi được xử lý trực tiếp bởi hệ điều hành bên dưới. Điều này có thể làm cho một chương trình kém hiệu quả hơn nhiều, vì mỗi yêu cầu như vậy thường kích hoạt truy cập đĩa, hoạt động mạng hoặc một số hoạt động khác tương đối tốn kém. Để giảm bớt loại chi phí này, nền tảng Java triển khai các luồng I / O được đệm.
Luồng được đệm:
Các luồng đầu vào có bộ đệm đọc dữ liệu từ một vùng nhớ được gọi là bộ đệm ; API đầu vào gốc chỉ được gọi khi bộ đệm trống.
Tương tự, các luồng đầu ra có bộ đệm ghi dữ liệu vào bộ đệm và API đầu ra gốc chỉ được gọi khi bộ đệm đầy.
Một chương trình có thể chuyển đổi một bộ đệm dòng thành một đệm dòng bằng cách sử dụng gói thành ngữ, nơi mà không có bộ đệm dòng đối tượng sẽ được chuyển cho các nhà xây dựng cho một đệm lớp suối.
Thí dụ:
inputStream = new BufferedReader(new FileReader("xanadu.txt"));
outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));
Có 4 lớp luồng được đệm được sử dụng để bọc các luồng không được đệm:
Để tạo Byte Stream được đệm , sử dụng và các lớp.BufferedInputStream
BufferedOutputStream
Để tạo Dòng ký tự đệm , sử dụng và các lớp.BufferedReader
BufferedWriter