2011-12-01 34 views
6

Tôi cần phải hiểu sự khác biệt giữa hai lớp này và cách chúng hoạt động với nhau. Tôi hiểu rằng FileReader đọc các ký tự từ một tệp một ký tự tại một thời điểm và BufferedReader đọc một đoạn lớn dữ liệu và lưu trữ nó trong một bộ đệm và do đó làm cho nó nhanh hơn.Nhà xây dựng BufferedReader mong đợi một FileReader

Để sử dụng BufferedReader, tôi phải cung cấp cho nó một FileReader. Lớp BufferedReader sử dụng FileReader như thế nào nếu nó đọc tệp khác nhau? Điều đó có nghĩa là BufferedReader sử dụng FileReader và do đó đằng sau hậu trường, các ký tự vẫn đọc một ký tự cùng một lúc? Tôi đoán câu hỏi của tôi là lớp BufferedReader sử dụng lớp FileReader như thế nào.

+0

Bạn không nên quan tâm đến cách hoạt động của nó. Biết rằng điều đó có nghĩa là nó có khả năng hiệu quả hơn bất cứ thứ gì bạn có thể nghĩ ra. Và nếu bạn nhấn mạnh vào việc biết cách nó hoạt động chi tiết, hãy tiếp tục và nhìn vào mã nguồn. –

Trả lời

5

Trước hết, BufferedReader mất Reader, không phải là FileReader (mặc dù sau được chấp nhận).

Lớp trừu tượng Reader có một số phương pháp read(). Có một phiên bản đọc một ký tự cũng như hai phiên bản đọc một khối ký tự vào một mảng.

Chỉ nên sử dụng BufferedReader nếu bạn đang đọc từng ký tự đơn hoặc khối nhỏ tại một thời điểm.

Hãy xem xét hai yêu cầu sau đây:

char ch1 = fileReader.read(); 
char ch2 = bufferedReader.read() 

Người đầu tiên sẽ đi đến tập tin cơ bản, trong khi cái thứ hai có lẽ hầu hết sẽ hài lòng từ đệm nội bộ của BufferedReader.

2

Trình đọc tệp có khả năng đọc khối, không chỉ 1 ký tự cùng một lúc. Nó kế thừa các phương thức đọc (char []) từ Reader để bạn có thể đọc đến kích cỡ của mảng char [] mà bạn truyền vào. BufferedReader chỉ đơn giản là kết thúc tốt đẹp FileReader vì vậy khi bạn gọi phương thức read() trên BufferedReader, nó xử lý bộ đệm bên trong và gọi các phương thức read() trên Reader bên dưới của nó. Một trong những lý do chính mà bạn sử dụng BufferedReader là bạn có thể sử dụng phương thức readLine(). Một BufferedReader có thể bao bọc các Readers khác bên cạnh một FileReader (chẳng hạn như InputStreamReader).

+0

Khái niệm về gói BufferedReader 'một FileReader là một khái niệm quan trọng. Như đã đề cập trong dòng cuối cùng, một BufferedReader cũng có thể bao bọc các kiểu Readers khác như InputStreamReader ** và ** cũng có thể được bao bọc. Điều này được gọi là [Decorator Pattern] (http: //en.wikipedia.org/wiki/Decorator_pattern) Nó cho phép thêm một chức năng/hành vi vào một đối tượng động. – phuibers

6

BufferedReader sử dụng phương thức FileReader.read(char[] cbuf, int off, int len) mà bạn cũng có thể đọc nếu bạn muốn nhận nhiều hơn một ký tự cùng một lúc.

BufferedReader giúp việc đọc kích thước bạn muốn trở nên đơn giản hơn và vẫn hiệu quả. Nếu bạn luôn đọc các khối lớn, nó có thể hiệu quả hơn một chút để giảm BufferedReader.

2

BufferedReader thêm một lớp đệm trên đầu trang của bất kỳ trình đọc nào. Vấn đề là làm cho việc đọc tối ưu hơn so với việc đọc một tập tin, ổ cắm hoặc một cái gì đó một cách không bị cản trở. Nó cũng bổ sung thêm một số phương pháp tiện lợi không hoạt động tốt trừ khi nó đã tìm nạp trước một đoạn cho bạn. Trong trường hợp FileReader, bạn phải đọc một đoạn dữ liệu cho đến khi bạn tìm thấy một '\ n' để có thể làm một cái gì đó như BufferedReader.readLine() và sau đó bạn sẽ phải giữ phần còn lại của dữ liệu cho hoạt động đọc tiếp theo (chưa kể đến công việc cần thiết khi bạn phải chờ một nguồn dữ liệu chậm để cung cấp tất cả cho bạn).

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