Các chương trình thường bao gồm yêu cầu ghi nhanh dữ liệu vào tệp hoặc ở nơi khác. Và điều này đặt ra câu hỏi: Chúng ta nên làm điều này như thế nào? Chúng ta nên chọn lớp nào? Hôm nay chúng ta sẽ làm quen với một ứng cử viên phù hợp cho vai trò này — lớp BufferedWriter .

Tại sao chúng ta cần BufferedWriter?

BufferedWriter là lớp ghi các ký tự được đệm vào luồng. Nó cho phép bạn giảm số lần bạn truy cập phương tiện vật lý. Nghĩa là, thay vì ghi một ký tự mỗi lần, nó ghi dữ liệu vào bộ đệm, sau đó ghi tất cả các ký tự vào phương tiện cùng một lúc.

Điều này làm tăng đáng kể tốc độ ghi. Kích thước bộ đệm mặc định là 8192 ký tự, nhưng điều này có thể được thay đổi bằng cách chỉ định một kích thước mới trong hàm tạo:

BufferedWriter(Writer in, int sz)

Ở đây, đối số đầu tiên của hàm tạo là một luồng sẽ nhận dữ liệu mà chúng ta ghi. Và hóa ra sz là kích thước của bộ đệm mới.

Java cũng có một lớp BufferedReader : nó được sử dụng để đọc dữ liệu trong vùng đệm.

Bộ đệm chính xác là gì? Hãy lấy một ví dụ thực tế trong cuộc sống. Bộ đệm giống như một cái giỏ hoặc giỏ mua hàng ở siêu thị. Thay vì đi đến quầy thanh toán với một món đồ, trả tiền, đặt nó vào cốp xe ô tô của bạn và sau đó quay lại lấy một món đồ khác, chúng ta có thể lấy một chiếc xe đẩy hàng, đặt mọi thứ chúng ta muốn vào đó rồi thanh toán. tại quầy thanh toán. Đây chính xác là cách bộ đệm hoạt động: nó thu thập dữ liệu, sau đó lấy mọi thứ và ghi dữ liệu đó, thay vì ghi từng đoạn riêng biệt.

Constructor và phương thức của lớp BufferedWriter

Bây giờ chúng ta hãy xem xét kỹ hơn về lớp BufferedWriter . Có hai hàm tạo để tạo một đối tượng:

public BufferedWriter(Writer out)
public BufferedWriter(Writer out, int sz)

Trường hợp out trong cả hai hàm tạo là luồng để ghi vào và sz , như đã đề cập, là kích thước của bộ đệm.

Lớp BufferedWriter cũng có một số phương thức. Hôm nay chúng ta sẽ xem xét kỹ hơn một số trong số chúng:

ghi (char [] mảng) Ghi một mảng char vào bộ đệm
write(String s, int off, int len) Ghi một phần của chuỗi vào bộ đệm
nối thêm (char c) Viết một ký tự vào bộ đệm
append(CharSequence csq, int start, int end) Ghi một phần của mảng vào bộ đệm
dòng mới() Viết dấu tách dòng
tuôn ra() Xả dòng

Hãy viết một chương trình sẽ ghi một giá trị vào một tệp. Chonhà văntham số, chúng tôi sẽ vượt qua mộtFileWriterđến nhà xây dựng. Nó được sử dụng để ghi các tệp văn bản và có một số hàm tạo để khởi tạo các đối tượng:

FileWriter(Tệp tệp)
FileWriter(Tệp tệp, boolean chắp thêm)
FileWriter(FileDescriptor fd)
FileWriter(String fileName)
FileWriter(Chuỗi tên tệp, boolean chắp thêm)

Ví dụ của chúng tôi, chúng tôi sẽ sử dụng một hàm tạo có tên tệp:

try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){

	String message = "Hello, Amigo! This is a very important message!";
	bufferedWriter.write(message);
	bufferedWritter.flush();
}
catch(IOException ex){
System.out.println(ex.getMessage());
 }

Mã của chúng tôi sẽ sử dụng phương thức write(String str) để ghi str vào tệp file.txt .

Có các phương pháp khác để viết:

  • write(char[] array ) — biến thể này chấp nhận và ghi một mảng char ;

  • write(String s, int off, int len) — biến thể này lấy một chuỗi s ; một offset off , là chỉ mục của ký tự để bắt đầu viết; và len , là độ dài của chuỗi (chuỗi con) được viết.

try(BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))){
	String message = "Hello, Amigo! This is a very important message!";
	bufferedWriter.write(message, 0, 11);
 	bufferedWriter.flush();

} catch(IOException ex) {
System.out.println(ex.getMessage());
}

Mã này sẽ viết "Xin chào, Amig" vào tệp, vì chúng tôi đã nói với phương thức viết 11 ký tự bắt đầu từ chỉ mục 0.

Mã của chúng tôi cũng có khối tài nguyên dùng thử :

try(BufferedWriter bufferedWritter = new BufferedWriter(new FileWriter("file.txt")))

Điều này có nghĩa là phương thức close() được gọi tự động trênđệmWriterđối tượng, bởi vì nó thực hiện giao diện AutoCloseable .

Phương thức flush() trong mã được sử dụng để xóa luồng đầu ra, buộc tất cả các byte được lưu trong bộ đệm phải được ghi. Quá trình ghi có thể không xảy ra nếu không có lệnh gọi này, vì nó chỉ ra rằng bộ đệm phải được xóa và các byte trong bộ đệm phải được ghi.

Lớp BufferedWriter cũng có một phương thức newLine() để thêm một dòng mới vào thông báo của chúng ta :

try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
        String message = "Hello, Amigo! This is a very important message!";
        bufferedWriter.write(message, 0, 13);
        bufferedWriter.newLine();
        bufferedWriter.write(message, 15, 33);
    } catch (IOException ex) {
        System.out.println(ex.getMessage());
    }

Trong tệp, chúng tôi nhận được:

Xin chào, Amigo!
Đây là một thông điệp rất quan trọng!

Chữ ký của phương thức append() trông như thế này:

public Writer append(CharSequence csq, int start, int end)

Nó được sử dụng để thêm csq . Ở đây bắt đầu là chỉ mục của ký tự đầu tiên và kết thúc là chỉ mục của ký tự cuối cùng của chuỗi (hoặc chuỗi con) được chèn vào. Ký tự có chỉ mục kết thúc không được chèn vào.

try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("file.txt"))) {
    String message = "Hello, Amigo! This is a very important message!";
    bufferedWriter.append(message, 0, 7);
    bufferedWriter.flush();
} catch (IOException ex) {
    System.out.println(ex.getMessage());
}

Mã này sẽ cung cấp cho bạn:

Xin chào,

Nghĩa là, với phương thức chắp thêm , bạn chỉ định phần nào của chuỗi sẽ được thêm vào bộ đệm.

Xem xét kỹ hơn sự khác biệt giữa write()append() , trước tiên chúng ta thấy rằng cả hai đều làm cùng một nguyên tắc — chúng viết các giá trị.

Tuy nhiên, điểm khác biệt là phương thức append mới hơn và lấy CharSequence làm đối số và vì String triển khai CharSequence , nên chúng ta có thể chuyển StringsStringBuildersStringBuffers sang phương thức append . Nhưng phương thức write() sẽ chỉ chấp nhận String .

Đó là nó cho bây giờ! Hôm nay chúng ta đã làm quen với bộ đệm, cách thực hiện ghi bộ đệm vào một tệp, cũng như các phương pháp mà bạn có thể sử dụng để thực hiện việc này.