Buffer là gì trong Java

Tôi vừa học về cách sử dụng đầu vào / đầu ra BufferedReader.

Tôi muốn biết chính xác ý nghĩa của thuật ngữ Streamvà Buffer?

Ngoài ra, dòng mã này phục vụ chúng ta những gì: BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

Java có hai loại lớp cho đầu vào và đầu ra (I / O): luồng và trình đọc / ghi .

Suối ( InputStream, OutputStreamvà tất cả mọi thứ mà kéo dài này) là để đọc và ghi dữ liệu nhị phân từ các tập tin, mạng, hoặc bất cứ thiết bị nào khác.

Người đọc và người viết là để đọc và viết văn bản (ký tự). Chúng là một lớp trên đầu các luồng, chuyển đổi dữ liệu nhị phân (byte) thành ký tự và ngược lại, sử dụng mã hóa ký tự .

Việc đọc dữ liệu từ từng byte trên đĩa rất kém hiệu quả. Một cách để tăng tốc là sử dụng bộ đệm: thay vì đọc từng byte một, bạn đọc vài nghìn byte cùng một lúc và đặt chúng vào bộ đệm, trong bộ nhớ. Sau đó, bạn có thể xem từng byte trong bộ đệm một.

Hướng dẫn Java của Oracle về I / O giải thích nó một cách chi tiết.

Nhìn vào dòng mã bạn đã cung cấp: BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

System.inlà một InputStream. Bạn tạo một tài InputStreamReaderkhoản đọc các byte từ đó System.in. Sau đó, bạn bọc nó trong một BufferedReader.

Vì vậy, cuối cùng, bạn có một BufferedReaderđọc từ một InputStreamReaderđọc từ System.in.

Đệ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.

  1. Luồng Byte (đọc hoặc ghi byte)
  2. Dòng ký tự (đọc hoặc ghi ký tự)
  3. 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.BufferedInputStreamBufferedOutputStream

Để tạo Dòng ký tự đệm  , sử dụng và các lớp.BufferedReaderBufferedWriter

Đó là một câu hỏi trong tâm trí của những ai bắt đầu làm việc trên gói java.io. Để trả lời các thuật ngữ câu hỏi của bạn, InputStreamReader và BufferedReader chỉ đại diện cho các đối tượng java (không có gì đặc biệt về chúng) nhưng chúng được tạo cho các hoạt động io như đọc và ghi từ / đến các đầu vào / đầu ra khác nhau như tệp, đối tượng, v.v.

Bây giờ chúng ta hãy đến hàng BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

InputStreamReader là lớp để đọc dòng đầu vào của các byte, nhưng để đọc từng byte là một thao tác tốn kém, vì vậy chúng tôi đang quấn nó xung quanh BufferedReader để có bộ đệm (đó là mẫu trang trí)

Vì vậy, những gì sẽ xảy ra là ngay cả trước khi bạn bắt đầu đọc, bufferedReader sẽ lưu trữ một số đoạn byte trong thanh ghi và khi bạn thực hiện thao tác đọc. nó sẽ được đọc từ vị trí đó ít tốn kém hơn nhiều so với đọc từ bảng điều khiển / tệp Nhưng trong trường hợp của InputStreamReader, khi bạn thực hiện thao tác đọc mỗi khi thao tác truy cập đĩa diễn ra

Luồng là kết nối và thông tin thực tế được chuyển giữa các điểm. Bộ đệm là một bộ chứa lưu trữ lưu trữ một phần hoặc tất cả dữ liệu được truyền trực tuyến và cấp dữ liệu này đến thiết bị đầu ra.

Tất nhiên, vấn đề là nếu luồng chậm quá tốc độ dữ liệu cần thiết để hiển thị dữ liệu, thì đầu ra sẽ tạm dừng. Bộ đệm ngăn chặn điều này.

Bộ đệm là một phần trong bộ nhớ được sử dụng để lưu trữ luồng dữ liệu từ các thiết bị ngoại vi. Sau đó từ vùng đệm này luồng dữ liệu này được thu thập và lưu trữ trong các biến. Luồng có thể được định nghĩa là một luồng dữ liệu liên tục.

Thuật ngữ đầu vào / đầu ra không có nghĩa gì khác hơn là di chuyển dữ liệu vào và ra khỏi bộ đệm. Chỉ cần ghi nhớ điều này trong tâm trí của bạn mọi lúc. Các quy trình thực hiện I / O bằng cách yêu cầu hệ điều hành lấy dữ liệu ra khỏi bộ đệm (thao tác ghi) hoặc bộ đệm được lấp đầy bằng dữ liệu (thao tác đọc).
Sơ đồ logic về cách dữ liệu di chuyển

Nói một cách dễ hiểu, hãy tưởng tượng khi bạn nhập dữ liệu vào bàn phím, dữ liệu sẽ di chuyển qua một đường ống ( luồng ) đến bộ đệm và sau đó từ bộ đệm đến đĩa (thao tác ghi). Tương tự khi dữ liệu di chuyển từ đĩa sang bộ đệm và từ bộ đệm sang bảng điều khiển của bạn thì đó là hoạt động đọc.

Bạn có thể đọc các liên kết để hiểu rõ hơn. Hy vọng nó giúp!.
Bộ đệm trong Java là gì,
hãy nhập mô tả liên kết vào đây

Video liên quan