Trong hướng dẫn này, chúng ta sẽ tìm hiểu về BufferedInputStream trong Java và các phương thức của nó với sự trợ giúp của các ví dụ.

lớp BufferedInputStream của gói java.io phần mềm được sử dụng với các dòng đầu vào khác để đọc dữ liệu (tính theo byte) một cách hiệu quả hơn.

Nó mở rộng lớp InputStream trừu tượng.

1. Hoạt động của BufferedInputStream

Nó BufferedInputStream duy trì một bộ đệm bên trong 8192 byte .

Trong quá trình đọc trong BufferedInputStream, một đoạn byte được đọc từ đĩa và được lưu trữ trong bộ đệm bên trong. Và từ các byte đệm bên trong được đọc riêng lẻ.

Do đó, số lượng thông tin liên lạc đến đĩa bị giảm. Đây là lý do tại sao đọc byte nhanh hơn bằng cách sử dụng BufferedInputStream.

2. Tạo một dòng BufferedInputStream

Để tạo một trước tiên chúng ta phải nhập gói BufferedInputStream, java.io.BufferedInputStream. Khi chúng tôi nhập gói ở đây là cách chúng tôi có thể tạo luồng đầu vào.

// Creates a FileInputStream
FileInputStream file = new FileInputStream(String path);

// Creates a BufferedInputStream
BufferedInputStream buffer = new BufferInputStream(file);

Trong ví dụ trên, chúng tôi đã tạo ra một BufferdInputStream tên đệm với cái FileInputStream tên tập tin.

Ở đây, bộ đệm bên trong có kích thước mặc định là 8192 byte. Tuy nhiên, chúng tôi cũng có thể chỉ định kích thước của bộ đệm bên trong.

// Creates a BufferedInputStream with specified size internal buffer
BufferedInputStream buffer = new BufferInputStream(file, int size);

Các đệm sẽ giúp đọc byte từ tệp nhanh hơn.

3. Phương thức BufferedInputStream

lớp BufferedInputStream cung cấp triển khai cho các phương thức khác nhau trình bày trong lớp InputStream.

3.1 phương thức read()

  • read() – đọc một byte đơn từ luồng đầu vào
  • read(byte[] arr) – đọc các byte từ luồng và lưu trữ trong mảng được chỉ định
  • read(byte[] arr, int start, int length) – đọc số byte bằng chiều dài từ luồng và lưu trữ trong mảng được chỉ định bắt đầu từ vị trí khởi đầu

Giả sử chúng ta có một tệp có tên input.txt với nội dung như sau.

This is a line of text inside the file.

Hãy thử đọc tệp bằng cách sử dụng BufferedInputStream.

import java.io.BufferedInputStream;
import java.io.FileInputStream;

class Main {
    public static void main(String[] args) {
        try {

            // Creates a FileInputStream
            FileInputStream file = new FileInputStream("input.txt");

            // Creates a BufferedInputStream
            BufferedInputStream input = new BufferedInputStream(file);

            // Reads first byte from file
            int i = input .read();

            while (i != -1) {
                System.out.print((char) i);

                // Reads next byte from the file
                i = input.read();
            }
            input.close();
        }

        catch (Exception e) {
            e.getStackTrace();
        }
    }
}

Đầu ra

This is a line of text inside the file.

Trong ví dụ trên, chúng tôi đã tạo một luồng đầu vào được đệm có tên đệm cùng với FileInputStream. Luồng đầu vào được liên kết với tệp input.txt .

FileInputStream file = new FileInputStream("input.txt");
BufferedInputStream buffer = new BufferedInputStream(file);

Ở đây, chúng tôi đã sử dụng phương thức read() để đọc một mảng byte từ bộ đệm bên trong của bộ đọc đệm.

3.2 phương thức available()

Để có được số byte có sẵn trong luồng đầu vào, chúng ta có thể sử dụng phương thức available() . Ví dụ,

import java.io.FileInputStream;
import java.io.BufferedInputStream;

public class Main {

   public static void main(String args[]) {

      try {

         // Suppose, the input.txt file contains the following text
         // This is a line of text inside the file.
         FileInputStream file = new FileInputStream("input.txt");
         
         // Creates a BufferedInputStream
         BufferedInputStream buffer = new BufferedInputStream(file);

         // Returns the available number of bytes
         System.out.println("Available bytes at the beginning: " + buffer.available());

         // Reads bytes from the file
         buffer.read();
         buffer.read();
         buffer.read();

         // Returns the available number of bytes
         System.out.println("Available bytes at the end: " + buffer.available());

         buffer.close();
      }

      catch (Exception e) {
         e.getStackTrace();
      }
   }
}

Đầu ra

Available bytes at the beginning: 39
Available bytes at the end: 36

Trong ví dụ trên,

  1. Đầu tiên chúng tôi sử dụng phương thức available() để kiểm tra số lượng byte có sẵn trong luồng đầu vào.
  2. Sau đó, chúng tôi đã sử dụng phương thức read()3 lần để đọc 3 byte từ luồng đầu vào.
  3. Bây giờ, sau khi đọc các byte, chúng tôi lại kiểm tra các byte có sẵn. Lần này số byte khả dụng giảm đi 3.

3.3 phương thức skip()

Để loại bỏ và bỏ qua số byte được chỉ định, chúng ta có thể sử dụng phương thức skip(). Ví dụ,

import java.io.FileInputStream;
import java.io.BufferedInputStream;

public class Main {

   public static void main(String args[]) {

      try {
         // Suppose, the input.txt file contains the following text
         // This is a line of text inside the file.
         FileInputStream file = new FileInputStream("input.txt");

         // Creates a BufferedInputStream
         BufferedInputStream buffer = new BufferedInputStream(file);

         // Skips the 5 bytes
         buffer.skip(5);
         System.out.println("Input stream after skipping 5 bytes:");

         // Reads the first byte from input stream
         int i = buffer.read();
         while (i != -1) {
            System.out.print((char) i);

            // Reads next byte from the input stream
            i = buffer.read();
         }

         // Closes the input stream
         buffer.close();
      }

      catch (Exception e) {
         e.getStackTrace();
      }
   }
}

Đầu ra

Input stream after skipping 5 bytes: is a line of text inside the file.

Trong ví dụ trên, chúng tôi đã sử dụng phương thức skip() bỏ qua 5 byte từ luồng đầu vào tệp. Do đó, các byte ‘T’, ‘h’, ‘i’, ‘s’và ‘ ‘được bỏ qua từ dòng đầu vào.

3.4 phương thức close()

Để đóng luồng đầu vào được đệm, chúng ta có thể sử dụng phương thức close(). Khi close()phương thức được gọi, chúng ta không thể sử dụng luồng đầu vào để đọc dữ liệu.

4. Các phương thức khác của BufferedInputStream

Phương thứcMô tả
mark()đánh dấu vị trí trong luồng đầu vào mà dữ liệu đã được đọc
reset()trả lại điều khiển về điểm trong luồng đầu vào nơi đặt dấu

Để tìm hiểu thêm, hãy truy cập Java BufferdInputStream (tài liệu Java chính thức) .

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!