Mục lục
Điểm khác nhau cơ bản giữa FileWriter và FileOutputStream là FileWriter ghi file dưới dạng luồng ký tự khác với FileOutputStream ghi file theo luồng byte. Vì vậy FileWriter được khuyến khích cho sử dụng ghi file text hơn so với FileOutputStream.
Khởi tạo FileWriter
FileWriter cung cấp nhiều constructor để khởi tạo với nhiều mục đích khác nhau như bạn có thể chọn ghi đè lên nội dung của file nếu nó đã tồn tại hoặc nối tiếp theo sau nội dung đã có sẵn etc.
- FileWriter(File file) – Khởi tạo FileWriter object sử dụng File. Nội dung cũ sẽ bị ghi đè bởi nội dung mới mà FileWriter object ghi xuống.
- FileWriter(File file, boolean append) – Khởi tạo FileWriter object sử dụng File. Nội dung cũ sẽ bị ghi đè bởi nội dung mới mà FileWriter object ghi xuống nếu append false, nếu append true thì nội dung sẽ nối đuôi nội dung cũ.
- FileWriter(FileDescriptor fd) – Khởi tạo FileWriter object sử dụng FileDescriptor. Nội dung cũ sẽ bị ghi đè bởi nội dung mới mà FileWriter object ghi xuống.
- FileWriter(String pathName) – Khởi tạo FileWriter object sử dụng đường dẫn đến file. Nội dung cũ sẽ bị ghi đè bởi nội dung mới mà FileWriter object ghi xuống.
- FileWriter(String pathName, boolean append) – Khởi tạo FileWriter object sử dụng đường dẫn đến file. Nội dung cũ sẽ bị ghi đè bởi nội dung mới mà FileWriter object ghi xuống nếu append false, nếu append true thì nội dung sẽ nối đuôi nội dung cũ.
Ví dụ FileWriter trong java
Chúng ta có thể ghi một ký tự đơn xuống file với write(int c) method.
import java.io.FileWriter; import java.io.IOException; class FileWriterWriteIntExample { public static void main(String[] args) { FileWriter fileWriter = null; try { fileWriter = new FileWriter("/Users/nguyenthanhhai/Desktop/test.txt"); //inherited method from java.io.OutputStreamWriter fileWriter.write(65); fileWriter.write(66); fileWriter.write(67); } catch (Exception e) { e.printStackTrace(); }finally { try { if (fileWriter != null) { fileWriter.flush(); fileWriter.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
write(String str, int off, int len) cho phép chúng ta ghi một chuỗi con của str, bắt đầu tại vị trí off và chuỗi con có chiều dài tối đa là len.
import java.io.FileWriter; class FileWriterWriteStringExample { public static void main(String[] args) { String data = "This is FileWriter Example."; try(FileWriter fileWriter = new FileWriter("/Users/nguyenthanhhai/Desktop/test.txt")) { //inherited method from java.io.OutputStreamWriter fileWriter.write(data, 8, 10); } catch (Exception e) { e.printStackTrace(); } } }
Output: FileWriter
write(char[] cbuf, int off, int len) cho phép chúng ta ghi một mảng con của cbuf, bắt đầu tại vị trí off và chuỗi con có chiều dài tối đa là len.
import java.io.FileWriter; class FileWriterWriteStringExample { public static void main(String[] args) { char[] data = "This is FileWriter Example.".toCharArray(); try(FileWriter fileWriter = new FileWriter("/Users/nguyenthanhhai/Desktop/test.txt")) { //inherited method from java.io.OutputStreamWriter fileWriter.write(data, 8, 10); } catch (Exception e) { e.printStackTrace(); } } }
Sử dụng write(char[] cbuf)để ghi toàn bộ các ký tự trong mảng cbuf vào file
import java.io.FileWriter; class FileWriterWriteStringExample { public static void main(String[] args) { char[] data = new char[100]; data[0] = 65; data[1] = 66; data[2] = 67; try(FileWriter fileWriter = new FileWriter("/Users/nguyenthanhhai/Desktop/test.txt")) { //inherited method from java.io.OutputStreamWriter fileWriter.write(data); } catch (Exception e) { e.printStackTrace(); } } }
Output: ABC
Note: Các phần tử không có giá trị sẽ được bỏ qua trong quá trình ghi.
import java.io.FileWriter; class FileWriterWriteStringExample { public static void main(String[] args) { char[] data = new char[100]; data[0] = 65; data[1] = 66; data[2] = 67; data[9] = 67; try(FileWriter fileWriter = new FileWriter("/Users/nguyenthanhhai/Desktop/test.txt")) { //inherited method from java.io.OutputStreamWriter fileWriter.write(data); } catch (Exception e) { e.printStackTrace(); } } }
Output: ABCC
Như vậy thì các bạn thấy giá trị từ vị trí thứ 3 đến 8 trong mảng rỗng và đã bị bỏ qua, kết quả nhận được là cộng dồn theo thứ tự 0,1,2,9.
Ghi một String xuống file chúng ta có thể sử dụng write(String method). hoặc sử dụng append(CharSequence c).
import java.io.FileWriter; class FileWriterWriteStringExample { public static void main(String[] args) { try(FileWriter fileWriter = new FileWriter("/Users/nguyenthanhhai/Desktop/test.txt")) { //inherited method from java.io.OutputStreamWriter fileWriter.write("XXX"); fileWriter.append("YZ"); } catch (Exception e) { e.printStackTrace(); } } }
flush() trong FileWriter
Gọi flush() method sẽ ngay lập tức ghi dữ liệu xuống output file.
import java.io.FileWriter; class FileWriterFlushExample { public static void main(String[] args) { try(FileWriter fileWriter = new FileWriter("/Users/nguyenthanhhai/Desktop/test.txt")) { //inherited method from java.io.Writer fileWriter.write("Shareprogramming"); //inherited method from java.io.OutputStreamWriter fileWriter.flush(); fileWriter.write(" Tutorials"); fileWriter.flush(); } catch (Exception e) { e.printStackTrace(); } } }
Đóng kết nối FileWriter
Sau khi hoàn tất các tác vụ FileWriter phải ngắt kết nối đến các tài nguyên mà nó đang tham chiếu đến, sử dụng close() method để ngắt kết nối.
fileWriter.close();
Note: Sau khi đã ngắt kết nối chúng ta không thể thao tác gì thêm đối với các tài nguyên mà nó đang tham chiếu đến. Nếu không sẽ gặp các exception.
import java.io.FileWriter; class FileWriterFlushExample { public static void main(String[] args) { try(FileWriter fileWriter = new FileWriter("/Users/nguyenthanhhai/Desktop/test.txt")) { //inherited method from java.io.Writer fileWriter.write("Shareprogramming"); //inherited method from java.io.OutputStreamWriter fileWriter.close(); fileWriter.write(" Tutorials"); fileWriter.flush(); } catch (Exception e) { e.printStackTrace(); } } }
Output:
java.io.IOException: Stream closed
at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:45)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:118)
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:135)
at java.io.OutputStreamWriter.write(OutputStreamWriter.java:220)
at java.io.Writer.write(Writer.java:157)
at FileWriterFlushExample.main(Main.java:12)
Kết
Với các method hỗ trợ ghi ký tự xuống file text thì FileWriter nên được dùng hơn FileOutputStream khi chúng ta cần ghi file text trong java.
Nguồn tham khảo