2012-09-10 66 views
57

Sự khác biệt giữa những gì? Tôi chỉ học Java ATM, nhưng nó có vẻ như tôi có thể viết vào một tập tin cả hai cách tức (Tôi không sao chép khối try-catch ở đây.)Sự khác biệt về Java giữa FileWriter và BufferedWriter

FileWriter file = new FileWriter("foo.txt"); 
file.write("foobar"); 
file.close(); 

FileWriter file = new FileWriter("foo.txt"); 
BufferedWriter bf = new BufferedWriter(file); 
bf.write("foobar"); 
bf.close(); 

Tôi hiểu khái niệm về đệm dữ liệu đầu tiên, vậy điều đó có nghĩa là ví dụ đầu tiên viết từng ký tự một và bộ đệm thứ hai đầu tiên vào bộ nhớ và viết nó một lần?

Trả lời

73

BufferedWriter là hiệu quả hơn nếu bạn

  • có nhiều ghi giữa tuôn ra/đóng
  • các ghi là nhỏ so với kích thước bộ đệm.

Trong ví dụ của bạn, bạn chỉ có một lần viết, vì vậy BufferedWriter chỉ thêm phí mà bạn không cần.

như vậy không có nghĩa là ví dụ đầu tiên viết những nhân vật từng người một và bộ đệm đầu tiên thứ hai nó vào bộ nhớ và viết nó một lần

Trong cả hai trường hợp, các chuỗi được viết cùng một lúc.

Nếu bạn sử dụng chỉ FileWriter viết của bạn (String) gọi

public void write(String str, int off, int len) 
     // some code 
     str.getChars(off, (off + len), cbuf, 0); 
     write(cbuf, 0, len); 
} 

Điều này làm cho một cuộc gọi hệ thống, mỗi cuộc gọi để viết (String).


Trường hợp BufferedWriter cải thiện hiệu quả bằng nhiều lần viết nhỏ.

for(int i = 0; i < 100; i++) { 
    writer.write("foorbar"); 
    writer.write(NEW_LINE); 
} 
writer.close(); 

Nếu không có một BufferedWriter này có thể làm cho 200 (2 * 100) cuộc gọi hệ thống và ghi vào đĩa mà không hiệu quả. Với BufferedWriter, tất cả những bộ đệm này có thể được đệm với nhau và vì kích thước bộ đệm mặc định là 8192 ký tự, nó chỉ trở thành 1 lời gọi hệ thống để ghi.

+0

Tôi có một câu hỏi rằng khi tôi đang sử dụng FileWriter, sau khi 'write' trả về, java có đảm bảo rằng nội dung được flush trong đĩa HOẶC chỉ trong pagecache mà os sẽ tuôn ra khi cần thiết? – Jaskey

+0

@Jaskey nếu bạn sử dụng FIleWriter unbuffered, write() có nghĩa là hệ điều hành có một bản sao mà nên được ghi vào đĩa cuối cùng. –

4

BufferedWriter hiệu quả hơn. Nó tiết kiệm nhỏ viết và viết trong một đoạn lớn hơn nếu bộ nhớ phục vụ cho tôi một cách chính xác. Nếu bạn đang làm rất nhiều viết nhỏ sau đó tôi sẽ sử dụng BufferedWriter. Gọi ghi cuộc gọi đến hệ điều hành mà là chậm để có càng ít viết càng tốt thường là mong muốn.

8

Bạn nói đúng. Sau đây là cách write() phương pháp BufferedWriter trông:

public void write(int c) throws IOException { 
    synchronized (lock) { 
     ensureOpen(); 
     if (nextChar >= nChars) 
      flushBuffer(); 
     cb[nextChar++] = (char) c; 
    } 
} 

Như bạn có thể nhìn thấy nó thực sự kiểm tra xem bộ đệm đầy (if (nextChar >= nChars)) và xóa bộ đệm. Sau đó, nó thêm ký tự mới vào bộ đệm (cb[nextChar++] = (char) c;).

0

Từ đặc tả Java API:

FileWriter

Thuận tiện lớp để viết file nhân vật. Các hàm tạo của lớp này giả định rằng mã hóa ký tự mặc định và kích thước bộ đệm byte mặc định là chấp nhận được.

BufferedWriter

Viết văn bản đến một dòng ký tự đầu ra, bộ đệm ký tự để quy định việc ghi hiệu quả của các nhân vật duy nhất, mảng, và chuỗi.

0

http://docs.oracle.com/javase/1.5.0/docs/api/java/io/BufferedWriter.html

Nói chung, một Writer gửi sản lượng của nó ngay cho nhân vật hoặc byte dòng cơ bản. Trừ khi có yêu cầu đầu ra, bạn nên quấn một BufferedWriter xung quanh bất kỳ Writer nào có các hoạt động write() 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 vào tệp. Nếu không có bộ đệm, mỗi lời gọi phương thức print() sẽ làm cho các ký tự được chuyển đổi thành các byte mà sau đó sẽ được ghi ngay lập tức vào tệp, có thể rất không hiệu quả.

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