2012-03-10 29 views

Trả lời

66

Theo cách đơn giản:

Một FileReader lớp là một công cụ chung để đọc bằng ký tự từ một tập tin. Lớp BufferedReader có thể bao quanh các trình đọc, như FileReader, để đệm đầu vào và nâng cao hiệu quả. Vì vậy, bạn sẽ không sử dụng cái kia, nhưng cả hai cùng một lúc bằng cách chuyển đối tượng FileReader đến hàm tạo BufferedReader.

Rất chi tiết

FileReader được sử dụng cho đầu vào của dữ liệu ký tự từ một tập tin trên đĩa. Tệp đầu vào có thể là một ASCII thông thường, một byte cho mỗi tệp văn bản ký tự. Luồng Reader sẽ tự động dịch các ký tự từ định dạng tệp đĩa sang định dạng char nội bộ. Các ký tự trong tệp đầu vào có thể từ các bảng chữ cái khác được định dạng UTF hỗ trợ, trong trường hợp này sẽ có tối đa ba byte cho mỗi ký tự. Trong trường hợp này, các ký tự trong tệp cũng được dịch sang định dạng char.

enter image description here

Như với sản lượng, một thói quen tốt để sử dụng một bộ đệm để nâng cao hiệu quả. Sử dụng BufferedReader cho việc này. Đây là cùng lớp chúng tôi đã sử dụng cho đầu vào bàn phím. Những dòng này trông quen thuộc:

BufferedReader stdin = 
    new BufferedReader(new InputStreamReader(System.in)); 

Những dòng này tạo BufferedReader, nhưng kết nối với luồng đầu vào từ bàn phím chứ không phải tệp.

Nguồn: http://www.oopweb.com/Java/Documents/JavaNotes/Volume/chap84/ch84_3.html

-2

Bufferedreader - phương pháp mà bạn có thể sử dụng thực sự như là một thay thế cho phương pháp máy quét, nhận được tập tin, được đầu vào.

Trình đọc tệp - như tên cho thấy.

0

BufferedReader đòi hỏi một Reader, trong đó FileReader là một - nó xuống từ InputStreamReader, mà xuống từ Reader.

-1

Lớp FileReader giúp viết trên hồ sơ nhưng hiệu quả của nó thấp vì nó có yo lấy lại một ký tự tại một thời điểm từ tệp nhưng BufferedReader lấy khối dữ liệu và lưu trữ trong bộ đệm thay vì lấy lại một ký tự tại atime trở nên dễ dàng khi sử dụng bộ đệm.

63

Trước tiên, bạn nên hiểu luồng trong Java vì tất cả "người đọc" trong Java được xây dựng dựa trên khái niệm đó.

tập tin trực tuyến

tập tin trực tuyến được thực hiện bởi các FileInputStream đối tượng trong Java.

// it reads one byte at a time and stores into the 'byt' variable 
int byt; 
while((byt = fileInputStream.read()) != -1) { 
    fileOutputStream.write(byt); 
} 

Đối tượng này thực sự đọc một byte (8 bit) tại một thời điểm và ghi vào tệp đã cho.

Một ứng dụng thực tế sẽ là khi bạn làm việc với các tệp nhị phân/dữ liệu thô, chẳng hạn như tệp hình ảnh hoặc tệp âm thanh (sử dụng AudioInputStream thay vì FileInputStream cho tệp âm thanh). Mặt khác cho các tập tin văn bản, nó là rất bất tiện và chậm hơn, bởi vì looping thông qua một byte tại một thời điểm, sau đó làm một số chế biến và lưu trữ các byte trở lại là tẻ nhạt và tốn thời gian.

Bạn cũng cần phải cung cấp các ký tự thiết lập (nếu các nhân vật Latin hoặc Trung Quốc, vv) của tập tin văn bản, mà bạn đang đối phó với, để mã hóa hiệu quả và giải mã, nếu không, chương trình sẽ giải mã và mã hóa một số jibberish và bạn sẽ thấy toàn bộ các ký hiệu lạ được viết ra trong tệp văn bản của bạn.

file Reading

Đây chỉ là một cách nói "File streaming" với sự hỗ trợ ký tự thiết lập.

Lớp học FileReader được thiết kế đặc biệt để xử lý các tệp văn bản. Như bạn thấy trước đó, tệp Truyền trực tuyến là cách tốt nhất để xử lý dữ liệu nhị phân thô, nhưng vì lợi ích của văn bản, nó không hiệu quả.

Vì vậy, các anh chàng Java đã thêm lớp FileReader, để giải quyết cụ thể với các tệp văn bản. Nó đọc 2 byte tại một thời điểm (Một cải tiến lớn so với FileInputStream !! Tôi muốn nói sự lựa chọn vẫn tốt hơn sau đó trình chiếu một byte.)

nên thực hiện như,

int c; 
while ((c = fileReader.read()) != -1) { // some logic } 

Xin lưu ý , Cả hai trường hợp đều sử dụng biến số nguyên để lưu trữ giá trị được truy xuất từ ​​tệp đầu vào.

Ưu điểm duy nhất là vì lớp này giao dịch với các tệp văn bản, do đó bạn không phải chỉ định bộ ký tự của tệp văn bản và một số thuộc tính khác. Về cơ bản nó cung cấp một giải pháp out-of-the-box, cho hầu hết các trường hợp. Nó cũng hỗ trợ quốc tế hóa và bản địa hóa.

Nhưng một lần nữa nó vẫn còn chậm hơn (Hình ảnh đọc 2 byte một thời gian và lặp qua nó!).

Buffering suối

Để giải quyết vấn đề của vòng lặp liên tục hơn một byte hoặc 2. Những kẻ Java bổ sung thêm một chức năng đáng chú ý. "Để tạo bộ đệm, trước khi xử lý bộ đệm."

Khái niệm này giống như khi người dùng phát video trên YouTube. Bộ đệm video trước khi phát, vì vậy, người đó có được trải nghiệm xem video hoàn hảo (và tiếp tục lưu vào bộ đệm cho đến khi toàn bộ video được đệm trước thời gian, trong khi bạn xem.)

kỹ thuật tương tự được sử dụng bởi lớp BufferedReader, các BufferedReader đối tượng mất FileReader đối tượng, trong đó có tất cả các thông tin về các tập tin văn bản mà cần phải được đọc.

Đối tượng BufferReader sử dụng đối tượng Filereader để đọc tệp văn bản đã cho. Mỗi lần FileReader đọc 2 byte từ tệp văn bản, nó sẽ trả về dữ liệu cho đối tượng BufferReader. Bây giờ, đối tượng BufferReader cũng tạo ra một nơi bộ nhớ đặc biệt, được gọi là "Bộ đệm" và lưu trữ tất cả dữ liệu được lưu vào bộ đệm đó.

BufferedReader br = new BufferedReader(new FileReader("example.txt")); 

Quá trình đọc 2 byte trong một thời gian, tiếp tục lặp đi lặp lại cho đến khi FileReader hit đối tượng, '\ n', '\ r \ n' (A ký tự dòng mới), và BufferReader dừng đệm . Cho đến khi đọc hướng dẫn để đọc dòng tiếp theo (chính xác để đệm dòng tiếp theo) được đưa ra.

// this variable points to the buffered line 
String line; 

// Keep buffering the lines and print it. 
while ((line = br.readLine()) != null) { 
    printWriter.println(line); 
} 

Bây giờ đây, thay vì đọc 2 byte, sau đó làm một số phép thuật và sau đó lưu trữ nó trở lại, một dòng toàn bộ là lấy và lưu trữ trong RAM nơi nào đó, và khi bạn đang thực hiện với sự kỳ diệu, bạn có thể lưu trữ các toàn bộ dòng trở lại. Vì vậy, nó làm cho quá trình chạy nhanh hơn làm 2 byte một lần.

Nhưng một lần nữa, tại sao chúng ta cần chuyển đối tượng FileReader đến BufferReader? Chúng ta không thể nói "đệm tập tin này" và nó không, nó sẽ không ngọt ngào và ngắn?

Cách nó hoạt động là thế này, Lớp BufferReader là một câm lớp người chỉ biết làm thế nào để đệm, nó không có một đầu mối về những gì để đệm hay nó chỉ đơn giản không quan tâm. Vì vậy, được nói rằng, Khi bạn cung cấp FileReader, nó đệm một tập tin, theo cùng một cách nếu bạn cung cấp một đối tượng của InputStreamReader như,

// Object that reads console inputs 
InputStreamReader console = new InputStreamReader(System.in); 
BufferedReader br = new BufferedReader(console); 
System.out.println(br.readLine()); 

Nó sẽ quét các dữ liệu đầu vào Terminal/Bảng điều khiển cho đến khi nó chạm một biểu tượng dòng mới và lưu trữ dòng được quét vào bộ đệm.

Vì vậy, bây giờ bạn biết rằng người ta có thể đọc (đệm) nhiều con suối với lớp BufferReader, chẳng hạn như các file văn bản, bảng điều khiển, máy in, mạng dữ liệu vv, và tất cả các anh/cô ấy có cần nhớ là,

bufferedReader.readLine(); 

để in mọi thứ bạn đang lưu vào bộ đệm.

+4

Giải thích tuyệt vời! – JavaDeveloper

+1

cảm ơn! Tôi chỉ đang cố gắng giải thích một số khái niệm phức tạp! :) –

+0

Giải thích thực sự tốt đẹp, Nó triệt để xóa bỏ những nghi ngờ của tôi. :) –

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