2011-01-09 43 views
19

Cảm giác về kích thước bộ đệm trong hàm tạo là gì?Kích thước bộ đệm trong BufferedReader là gì?

BufferedReader(Reader in, int size) 

Như tôi đã viết chương trình:

import java.io.*; 
class bufferedReaderEx{ 
    public static void main(String args[]){ 
     InputStreamReader isr = null; 
     BufferedReader br = null; 
      try{ 
       isr = new InputStreamReader(System.in); 
//    System.out.println("Write data: "); 
//    int i = isr.read(); 
//    System.out.println("Data read is: " + i); 
       //Thus the InputStreamReader is useful for reading the character from the stream 
       System.out.println("Enter the data to be read by the bufferedReader: "); 
       //here isr is containing the lnefeed already so this is needed to be flushed. 
       br = new BufferedReader(isr, 2); 
       String str = br.readLine(); 
       System.out.println("The data is : :" + str); 
      }catch(IOException e){ 
       System.out.println("Can't read: " + e.getMessage()); 
      } 
    } 
} 

Output:

Enter the data to be read by the bufferedReader: Hello world and hello world again 
The data is: Hello world and hello world again 

Sau đó, những gì hiện các kích thước bộ đệm nghĩa như tôi dự định rằng nó sẽ được đọc chỉ có hai ký tự. nhưng không phải thế.

Trả lời

29

BufferedReader đệm đầu vào, giống như tên cho biết. Điều này có nghĩa là nó đọc từ nguồn đầu vào vào bộ đệm trước khi chuyển nó vào bạn. Kích thước bộ đệm ở đây đề cập đến số byte nó đệm.

Đầu vào đọc từ hầu hết các nguồn là rất chậm. Một bộ đệm chỉ 2 byte là sẽ làm tổn thương hiệu suất, vì chương trình của bạn rất có thể sẽ chờ đợi đầu vào phần lớn thời gian. Với kích thước bộ đệm là 2, đọc 100 byte sẽ dẫn đến việc đọc 2 byte từ bộ đệm trong bộ nhớ (rất nhanh), làm đầy bộ đệm (rất chậm), đọc 2 byte từ bộ đệm (rất nhanh), làm đầy đệm (rất chậm), vv - tổng thể rất chậm. Với kích thước bộ đệm 100, đọc 100 byte sẽ dẫn đến đọc 100 byte từ bộ đệm trong bộ nhớ (rất nhanh) - tổng thể rất nhanh. Đây là giả định bộ đệm có chứa 100 byte khi đọc mặc dù, trong một trường hợp như của bạn là một giả định hợp lý để thực hiện.

Trừ khi bạn biết mình đang làm gì, bạn nên sử dụng kích thước bộ đệm mặc định khá lớn. Một lý do cho một bộ đệm nhỏ hơn là khi bạn đang chạy trên một thiết bị bộ nhớ giới hạn, vì bộ đệm tiêu thụ bộ nhớ.

+0

thì ý nghĩa của kích thước bộ đệm là gì. bạn vui lòng giải thích? – codeomnitrix

+1

@codeonnitrix Đã thêm một chút giải thích. Hãy cho tôi biết nếu đó là đủ. – marcog

+0

thanks marcog .. – codeomnitrix

0

Đó là kích thước của bộ đệm đầu vào. Đọc thêm trong javadoc.

+0

Hey tôi hav đọc mà đã có, thực sự tôi muốn biết rằng những gì là hiệu quả của việc có kích thước bộ đệm ít hơn hoặc kích thước bộ đệm lớn. ý tôi là ý nghĩa của nó là gì. tôi có nghĩa là nếu kích thước bộ đệm là 12000 hoặc 200 thì nên sử dụng gì khi – codeomnitrix

+1

Bộ đệm có kích thước 12000 sẽ sử dụng nhiều bộ nhớ hơn nhưng hoạt động nhanh hơn. Thay vào đó với 200 nó sẽ hoạt động chậm hơn nhưng với việc sử dụng bộ nhớ nhỏ. * chậm hơn/nhanh hơn ở kích thước dữ liệu lớn. –

+0

sau đó có nghĩa là công việc sẽ được thực hiện mỗi lần nhưng trong một khối 20000 trước đây sẽ mất hai vòng trong khi trong khác cùng có 100 vòng. Là nó? – codeomnitrix

9

Khi bạn đọc hoặc viết trong một tệp, bạn phải truy nhập hạt nhân, thực sự có quyền truy cập vào tệp. Tất cả các hoạt động tập tin phải đi qua hạt nhân. Đây là một hoạt động khá tốn kém. Việc đệm gây ra một đoạn byte cần đọc; chúng được giữ ở một vị trí tạm thời trong RAM và các byte được đọc từ vị trí này. Bằng cách này, bạn không thường xuyên yêu cầu hạt nhân làm tệp IO.

Nếu bạn sử dụng kích thước bộ đệm lớn, bạn sẽ nâng cấp RAM một cách không cần thiết. Nếu bạn sử dụng một trong những nhỏ, bạn sẽ được bugging hạt nhân liên tục cho các yêu cầu tập tin. Tốt nhất là cho phép mặc định được sử dụng. Bạn có thể chỉ định kích thước bộ đệm và thử nghiệm. Hầu hết các máy sẽ đọc một khu vực tại một thời điểm hoặc một số nguyên của các lĩnh vực. Kích thước ngành phụ thuộc vào cách bạn định dạng máy của mình.

Thử nghiệm sau đây thật thú vị. Tạo một tệp với 1.000.000 số 0 trong đó. Sử dụng tính năng định thời của hệ điều hành để xem tốc độ sao chép nó vào một tệp khác (bạn sẽ viết một chương trình sao chép với bộ đệm đệm và không đệm). Thời gian nó với các kích cỡ bộ đệm khác nhau bao gồm cả mặc định.

8

http://www.docjar.com/html/api/java/io/BufferedReader.java.html

Theo tài liệu java này, kích thước bộ đệm mặc định là 8192 ký tự. Kích thước đường được coi là 80 ký tự.

8192 kích thước bộ đệm đủ cho kích thước tệp nhỏ hơn. Nhưng một lần nữa điều này có thể phát triển được. nếu tệp chứa hơn 8192 ký tự, thì phương thức điền của trình bufferedreader sẽ tăng kích thước bộ đệm trước khi đọc nội dung từ tệp.Đối với các tệp nội dung lớn hơn, hãy đặt kích thước tối đa của riêng bạn thành bộ đệm trong khi tạo trình đọc đệm thông qua hàm tạo, để bạn có thể tránh tạo lại bộ nhớ và sao chép mảng cũ vào mảng mới được tạo.

+0

Thẳng về phía trước và xóa thông [email protected] –

+0

Bộ đệm thực sự không bao giờ phát triển. Nó có kích thước không đổi. Nó được sử dụng như một bộ nhớ trong bộ nhớ trung gian khi đọc từ một tập tin. Tôi lười biếng giải thích thêm, vì vậy hãy xem xét điều này: https://stackoverflow.com/questions/648309/what-does-it-mean-by-buffer – gargii

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