Tags:

Tối ưu hoá tốc độ ghi file text với BufferedWriter

BufferedWriter sẽ rất có ích nếu chúng ta muốn ghi nội dung văn bản xuống file text.

BufferedWriter giúp chúng ta giảm thiểu số lượng thao tác I/O với cơ chết sử dụng bộ nhớ đệm(mảng ký tự với kích thước mặc định là 8192). Khi chúng ta ghi dữ liệu thì chúng sẽ được ghi vào bộ nhớ đệm thay vì ghi trực tiếp xuống đầu ra(file, socket, network etc). Dữ liệu sẽ được ghi xuống đầu ra khi bộ nhớ đệm đầy, quá trình này cứ tiếp tục đến lúc ghi hết dữ liệu.

java-bufferedwriter

Khởi tạo BufferedWriter

BufferedWriter là một clas bọc bên ngoài FileWriter để tạo cơ chế sử dụng bộ nhớ đệm cho FileWriter.

BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("/Users/nguyenthanhhai/Desktop/test.txt"));

Mặc định kích thước của bộ nhớ đệm là 8192, chúng ta có thể custom lại như sau.

int buffSize = 10000;
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("/Users/nguyenthanhhai/Desktop/test.txt"),
                buffSize);

Ghi ký tự đơn trong BufferedWriter

Sử dụng write(int c) để ghi một từng ký tự đơn.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

class BufferedWriterWriteExample {

    public static void main(String[] args) {
        File file = null;
        FileWriter fileWriter = null;
        BufferedWriter writer = null;
        try {
            file = new File("/Users/nguyenthanhhai/Desktop/test.txt");
            fileWriter = new FileWriter(file);
            // create file if not exists
            if (!file.exists()) {
                file.createNewFile();
            }
            // initialize BufferedWriter
            writer = new BufferedWriter(fileWriter);

            //write integers
            writer.write(65);
            writer.write(66);
            writer.write(67);
            System.out.println("File written successfully.");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // close BufferedWriter
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // close FileWriter
            if (fileWriter != null) {
                try {
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

}

Ghi một chuỗi trong BufferedWriter

write(String s, int off, int len) – Ghi mỗi chuỗi con của chuỗi s xuống BufferedWriter, chuỗi con được cắt bắt đầu tại vị trí off và cắt tối đa len ký tự. 

Hoặc write(String s) để ghi toàn bộ chuỗi s xuống BufferedWriter.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

class BufferedWriterWriteExample {

    public static void main(String[] args) throws IOException {
        File file = new File("/Users/nguyenthanhhai/Desktop/test.txt");
        BufferedWriter writer = new BufferedWriter(new FileWriter(file));
        String data = "This is BufferedWriter.";
        // create file if not exists
        if (!file.exists()) {
            file.createNewFile();
        }
        // write string
        writer.write(data, 5, 11);

        writer.write(data);
        System.out.println("File written successfully.");
        writer.close();

    }

}

Ghi một mảng ký tự trong BufferedWriter

writer(char[] cbuf, int off, int len) – Ghi mỗi mảng con của cbuf xuống BufferedWriter, mảng con được cắt bắt đầu tại vị trí off và cắt tối đa len ký tự.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

class BufferedWriterWriteExample {

    public static void main(String[] args) throws IOException {
        File file = new File("/Users/nguyenthanhhai/Desktop/test.txt");
        BufferedWriter writer = new BufferedWriter(new FileWriter(file));
       
        char[] data = "This is BufferedWriter.".toCharArray();;
        // create file if not exists
        if (!file.exists()) {
            file.createNewFile();
        }
        // write string
        writer.write(data, 5, 11);
        System.out.println("File written successfully.");
        writer.close();

    }

}

Xuống dòng trong BufferedWriter

newLine() method sẽ ghi một ký tự xuống dòng vào BufferedWriter.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

class BufferedWriterWriteExample {

    public static void main(String[] args) throws IOException {
        File file = new File("/Users/nguyenthanhhai/Desktop/test.txt");
        BufferedWriter writer = new BufferedWriter(new FileWriter(file));
        char[] data = "This is BufferedWriter.".toCharArray();;
        // create file if not exists
        if (!file.exists()) {
            file.createNewFile();
        }
        // write string
        writer.write(data, 5, 11);
        writer.newLine();
        writer.write(data, 0, 5);
        System.out.println("File written successfully.");
        writer.close();

    }

}

flush() trong BufferedWriter

Dữ liệu ghi vào BufferedWriter sẽ được lưu trong bộ nhớ đệm sau đó chúng mới được ghi xuống tập tin. Nếu vì lý do gì đó mà bạn muốn ghi dữ liệu xuống tập tin ngay lập tức thì sử dụng flush() để đẩy dữ liệu xuống tập tin mà không cần chờ đến khi BufferedWriter thực hiện.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

class BufferedWriterWriteExample {

    public static void main(String[] args) throws IOException {
        File file = new File("/Users/nguyenthanhhai/Desktop/test.txt");
        BufferedWriter writer = new BufferedWriter(new FileWriter(file));
        char[] data = "This is BufferedWriter.".toCharArray();;
        // create file if not exists
        if (!file.exists()) {
            file.createNewFile();
        }
        // write string
        writer.write(data, 5, 11);
        writer.flush();

        writer.newLine();
        writer.flush();

        writer.write(data, 0, 5);
        writer.flush();
        System.out.println("File written successfully.");
        writer.close();

    }

}

Đóng kết nối trong BufferedWriter

Sau khi mọi thao tác đã hoàn thành chúng ta cần phải đóng kết nối của BufferedWriter đến các tài nguyên mà nó đang tham chiếu đến.

Note: Chúng ta không cần đóng kết nối FileWriter vì nội bộ bên trong close() method của BufferedWriter đã đóng kết nối cho FileWriter.

bufferedWriter.close();

Chúng ta không thể thao tác gì thêm sau khi BufferedWriter đã đóng kết nối, nếu không java sẽ ném IOException.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

class BufferedWriterWriteExample {

    public static void main(String[] args) throws IOException {
        File file = new File("/Users/nguyenthanhhai/Desktop/test.txt");
        BufferedWriter writer = new BufferedWriter(new FileWriter(file));
        String data = "This is BufferedWriter.";
        // create file if not exists
        if (!file.exists()) {
            file.createNewFile();
        }
        // write string
        writer.write(data, 5, 11);
        writer.close();
        writer.write(data);
        System.out.println("File written successfully.");
        writer.close();

    }

}

Output:


Exception in thread “main” java.io.IOException: Stream closed
at java.io.BufferedWriter.ensureOpen(BufferedWriter.java:116)
at java.io.BufferedWriter.write(BufferedWriter.java:221)
at java.io.Writer.write(Writer.java:157)
at BufferedWriterWriteExample.main(Main.java:19)

Tóm lược

Trong đa số trường hợp chúng ta nên sử dụng BufferedWriter chung với FileWriter để tối ưu hoá tốc độ ghi file. Ngoài ra BufferedWriter còn cung cấp các method ghi file bằng String hiệu quả hơn so với ghi từng byte như write(String s) etc. 

Sử dụng newLine() nếu bạn muốn ghi dữ liệu vào dòng mới, newLine() sẽ ghi đúng ký tự xuống dòng với từng hệ thống cụ thể, ví dụ hệ điều hành windows, ubuntu có ký tự ngắt dòng khác nhau.

Nguồn tham khảo

https://www.digitalocean.com/community/tutorials/java-filewriter-example

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