Các Javadoc cung cấp một cuộc thảo luận hợp lý về chủ đề này:
Nói chung, một Writer gửi sản lượng của nó ngay cho cơ bản nhân vật hoặc byte stream. Trừ khi có yêu cầu đầu ra, nó là được khuyến khích để bọc một BufferedWriter xung quanh bất kỳ Writer nào viết() hoạt động có thể tốn kém, chẳng hạn như FileWriters và OutputStreamWriters. Ví dụ,
PrintWriter out = new PrintWriter(new BufferedWriter(new
FileWriter("foo.out")));
sẽ đệm đầu ra của PrintWriter để file . Nếu không có bộ đệm, mỗi lời gọi phương thức print() sẽ khiến các ký tự được chuyển đổi thành các byte mà sau đó sẽ được viết ngay lập tức vào tệp, có thể rất không hiệu quả.
Nếu bạn đang viết khối văn bản lớn cùng một lúc (như toàn bộ dòng) thì có thể bạn sẽ không nhận thấy sự khác biệt. Nếu bạn có nhiều mã gắn thêm một ký tự tại một thời điểm, tuy nhiên, một số BufferedWriter
sẽ hiệu quả hơn nhiều.
Sửa
Theo nhận xét của andrew của dưới đây, FileWriter
thực sự sử dụng riêng kích thước cố định 1024 bytes đệm của nó. Điều này đã được xác nhận bằng cách xem source code. Mặt khác, BufferedWriter
sources cho biết rằng nó sử dụng và kích thước bộ đệm 8192 byte (mặc định), có thể được người dùng định cấu hình theo bất kỳ kích thước mong muốn nào khác. Vì vậy, có vẻ như lợi ích của BufferedWriter
so với FileWriter
được giới hạn ở:
- Kích thước bộ đệm mặc định lớn hơn.
- Khả năng ghi đè/tùy chỉnh kích thước bộ đệm.
Và để lầy lội hơn nữa các vùng biển, các Java 6 implementation của OutputStreamWriter
thực sự đại biểu cho một StreamEncoder, trong đó sử dụng bộ đệm riêng của mình với một kích thước mặc định của 8192 byte. Và bộ đệm StreamEncoder
là người dùng có thể định cấu hình, mặc dù không có cách nào để truy cập trực tiếp thông qua kèm theo OutputStreamWriter
.
tôi nghĩ điều này là sai. như nó nói trong javadocs, filewriter không có bộ đệm - http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileWriter.html –
@andrew - Tốt, câu trả lời của tôi dựa trên những gì mà 'BufferedWriter' Javadoc đã nói. Tuy nhiên, sau khi xem xét một số [mã nguồn] (http://developer.classpath.org/doc/java/io/OutputStreamWriter-source.html), có vẻ như bạn đã đúng, ít nhất là cho 'FileWriter'. Bất cứ điều gì có nguồn gốc từ 'OutputStreamWriter' sẽ sử dụng một bộ đệm kích thước 1024 byte cố định. – aroth
vâng, thật đáng ngạc nhiên. tôi đã viết một câu trả lời tương tự như của bạn cho đến khi tôi tình cờ gặp comment trong outputsteamwriter. –