Mục lục
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.
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