Tags:

Tăng tốc độ ghi file với BufferedOutputStream

BufferedOutputStream sẽ lưu những byte được ghi xuống Output stream vào bộ nhớ đệm. Khi bộ đệm đến hạn thì BufferedInputStream mới thật sự ghi dữ liệu xuống Output, tránh việc mỗi lần bạn ghi từng byte thì phải gọi đến hệ thống để ghi dữ liệu xuống. 

Khởi tạo BufferedOutputStream

Để khởi tạo cơ chế đệm dữ liệu cho các OutputStream chúng ta sẽ bao bên ngoài nó một BufferedOutputStream.

OutputStream output = new BufferedOutputStream(
                      new FileOutputStream("c:\\data\\output-file.txt"));

Ghi dữ liệu trong BufferedOutputStream

Với BufferedOutputStream chúng ta có thể ghi dữ liệu theo từng byte hoặc theo một mảng byte với write() method.

write(int b)

BufferedOutputStream bufferedOutputStream =
    new BufferedOutputStream(new FileOutputStream("c:\\data\\output-text.txt"));

bufferedOutputStream.write(123);

write(byte[] b)

BufferedOutputStream bufferedOutputStream =
                new BufferedOutputStream(new FileOutputStream("c:\\data\\output-text.txt"));

byte[] bytes = new byte[]{1,2,3,4,5};

bufferedOutputStream.write(bytes);

Ví dụ ghi file với BufferedOutputStream

import java.io.*;

class BufferedOutputStreamDemo {
    public static void main(String args[]) throws Exception {
        try (FileOutputStream fout = new FileOutputStream("f1.txt");

             //creating bufferdOutputStream obj
             BufferedOutputStream bout = new BufferedOutputStream(fout)) {
            //illustrating write() method
            for (int i = 65; i < 75; i++) {
                bout.write(i);
            }

            byte b[] = {75, 76, 77, 78, 79, 80};
            bout.write(b);

            //illustrating flush() method
            bout.flush();

            //illustrating close() method
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Output: ABCDEFGHIJKLMNOP

Tối ưu hiệu suất với BufferedOutputStream

Chúng ta nên làm một vài thí nghiệm với các kích thước của mảng byte bên trong BufferedOutputStream để xem đâu là kích thước tối ưu cho mảng đệm. Kích thước của mảng đệm để tối ưu phụ thuộc vào phần cứng và network.

Ví dụ nếu ổ điã cứng luôn ghi dữ liệu với kích thước nhỏ nhất là 4kb thì thật là ngáo nếu kích thước bộ đệm nhỏ hơn 4Kb phải không nào. Chúng ta cần một mảng đệm có kích thước lớn hơn hoặc bằng 4Kb phải không nào? Cho nên chúng ta cần tìm hiểu xem ổ cứng của chúng ta ghi mỗi lần là bao nhiêu byte và đây rất có thể là kích thước tối ưu nhất cho bạn. 

Đóng BufferedOutStream

Để đóng kết nối của BufferedOutputStream sử dụng close() method. close() method sẽ giúp ngắt kết nối dữ BufferedOutputStream các tài liệu mà nó tham chiếu đến.

BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
                      new FileOutputStream("c:\\data\\output-file.txt"));

while(hasMoreData()) {
    int data = getMoreData();
    bufferedOutputStream.write(data);
}
bufferedOutputStream.close();

Flush() trong BufferedOutputStream

Trong thực tế khi bạn ghi dữ liệu trong BufferedOutputStream thì những dữ liệu này sẽ được ghi vào bộ nhớ đệm cho đến khi bộ nhớ đệm đầy thì dữ liệu mới được ghi xuống. flush() sẽ thực hiện việc ghi dữ liệu xuống output stream ngay lập tức mà không cần đợi cho đến khi bộ nhớ đệm đầy. 

OutputStream outputStream =
    new BufferedOutputStream(new FileOutputStream("c:\\data\\output-text.txt"));

byte bytes =  new byte[]{1,2,3,4,5};

outputStream.write(bytes);

outputStream.flush()

Nguồn tham khảo

https://www.geeksforgeeks.org/java-io-bufferedoutputstream-class-java/

http://tutorials.jenkov.com/java-io/bufferedoutputstream.html

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x