2011-08-08 21 views
7

Tôi nhìn vào sau exampleTrong Java, lợi thế của việc sử dụng BufferedWriter để nối thêm vào một tệp là gì?

Trong đó sử dụng đoạn mã sau

try { 
     BufferedWriter out = new BufferedWriter(new FileWriter("outfilename")); 
     out.write("aString"); 
     out.close(); 
    } 
catch (IOException e) {} 

gì là lợi thế hơn làm

FileWriter fw = new FileWriter("outfilename"); 

Tôi đã thử cả hai và họ dường như có thể so sánh về tốc độ khi nó đi kèm với nhiệm vụ gắn thêm một dòng vào một thời điểm

Trả lời

12

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, BufferedWritersources 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.

+0

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 –

+0

@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

+0

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. –

1

Hiệu ứng đệm dễ dàng hơn een khi tải cao. Lặp lại out.write vài nghìn lần và bạn sẽ thấy sự khác biệt.

Đối với một vài byte được chuyển trong một cuộc gọi, có lẽ BufferedWriter thậm chí còn tệ hơn (vì nó có thể xảy ra sau này gọi là FileOutputStream).

3

điều này được giải thích trong javadocs cho outputstreamwriter. một máy đánh chữ không có bộ đệm (trong bộ ghi dòng đầu ra cơ bản), nhưng bộ chuyển đổi mã hóa ký tự được gọi trên mỗi cuộc gọi để ghi. bằng cách sử dụng một bộ đệm bên ngoài tránh gọi trình chuyển đổi thường xuyên như vậy.

http://download.oracle.com/javase/1.4.2/docs/api/java/io/OutputStreamWriter.html

Các vấn đề liên quan