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.
Giải thích tuyệt vời! – JavaDeveloper
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! :) –
Giải thích thực sự tốt đẹp, Nó triệt để xóa bỏ những nghi ngờ của tôi. :) –