Bufferedreader là gì

Lớp tốt nhất để đọc dữ liệu nhập từ Console là lớp BufferedReader. Tuy nhiên chúng ta không thể xây dựng một lớp BufferedReader trực tiếp từ System.in. Thay vào đó chúng ta phải chuyển nó thành một luồng ký tự. Để làm điều này chúng ta dùng InputStreamReader chuyển bytes thành ký tự.

Để có được một đối tượng InputStreamReader gắn với System.in ta dùng constructor của InputStreamReader.

InputStreamReader(InputStream inputStream)

Tiếp theo dùng đối tượng InputStreamReader đã tạo ra để tạo ra một BufferedReader dùng constructor BufferedReader.

BufferedReader(Reader inputReader)

Ví dụ: Tạo một BufferedReader gắn với Keyboard

BufferedReader br = new BufferedReader(new

InputStreamReader(System.in));

Sau khi thực hiện câu lệnh trên, br là một luồng ký tự gắn với Console thông qua System.in.

Ví dụ: Dùng BufferedReader đọc từng ký tự từ Console. Việc
đọc kết thúc khi gặp dấu chấm (dấu chấm để kết thúc chương
trình).

import java.io.*;
class ReadChars
{

public static void main(String args[]) throws IOException
{

char c;

BufferedReader br = newBufferedReader(

new InputStreamReader(System.in));

System.out.println("Nhap chuoi ky tu,
     gioi han dau cham.");

// read characters
do

{

c = (char) br.read();
        System.out.println(c);
   } while(c != '.');

}

}

                                                                                                                                                                                                           Trương Đình Huy


Nếu bạn là một Java programmer thì hẳn là bạn cũng đã tiếp xúc nhiều với Scanner và BufferedReader dùng để nhập input đầu vào xử lí. Vậy sự khác biệt giữa Scanner và BufferedReader là gì ?
Class Scanner có thể đọc được các kiểu nguyên thủy và string khác nhau. Dễ thấy qua các method nextInt(), nextFloat(), nextDouble(), . . .
Class BufferedReader đọc text qua InputStreamReader chỉ đọc được text (String) nên hiệu quả hơn trong việc đọc text nhưng ta vẫn có thể chuyển kiểu về Int, Float, . . . nếu cần. BufferedReader là Đồng Bộ trong khi Scanner thì không vì thế với đa luồng ta cần sử dụng BufferedReader .
BufferedReader có bộ nhớ đệm lơn hơn nhiều so với Scanner trong khi Scanner(1KB) còn BufferedReader(8KB)

Dùng Scanner:

Scanner scanner = new Scanner(System.in); int number = scanner.nextInt();

Dùng BufferedReader:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine()// giả sử tôi nhập 13 int number = Integer.parseInt(str);//chuyển kiểu về int

Bufferedreader là gì

Lỗi thường gặp khi sử dụng scanner.nextX() X=Int || Float || Double || Byte || Byte || Short || Long hoặc chỉ là next() :
Nếu ta sử dụng nextLine() sau nextX() ở trên thì sẽ xảy ra lỗi là ta không đọc được giá trị dòng tiếp theo cần nhập bởi vì sau khi ta nhập nextX() ở trên ta còn ấn Enter 1 cái mà enter cũng được coi là 1 kí tự \n lên nextLine() sẽ đọc cái \n này chứ không lấy giá trị sau nó. Vì vậy để xử lí lỗi này ta cần thêm một next() hoặc nextLine() để đọc kí tự xuống dòng đó rồi. Sau đó nextLine() của ta mới đọc giá trị tiếp theo.

Code tham khảo

Scanner scanner = new Scanner(); int number = scanner.nextInt(); scanner.next(); // hoặc scanner.nextLine(); String = scanner.nextLine();

reference : https://www.geeksforgeeks.org/difference-between-scanner-and-bufferreader-class-in-java/

Conal Dev

BufferedReader đọc một vài ký tự từ luồng được chỉ định và lưu trữ nó trong bộ đệm. Điều này giúp nhập liệu nhanh hơn.

InputStreamReader chỉ đọc một ký tự từ luồng đã chỉ định và các ký tự còn lại vẫn còn trong luồng.

Thí dụ:

class NewClass{ public static void main(String args[]) throws IOException{ BufferedReader isr = new BufferedReader(new InputStreamReader(System.in)); Scanner sc = new Scanner(System.in); System.out.println("B.R. - "+(char)isr.read()); System.out.println("Scanner - " + sc.nextLine()); } }

Khi câu lệnh isr.read () được thực thi, tôi đã nhập đầu vào "hello" và ký tự "h" của "hello" được in trên màn hình. Nếu đây là InputStreamReader thì các ký tự còn lại “ello” sẽ vẫn còn trong luồng System.in và sc.nextLine () sẽ in chúng. Nhưng trong trường hợp này, điều đó không xảy ra vì BufferedReader đọc tất cả các ký tự “xin chào” từ luồng System.in và lưu trữ chúng trong bộ đệm cá nhân của riêng nó và do đó luồng System.in vẫn trống khi sc.nextLine () là Thực thi.

Đối với mã:

class NewClass{ public static void main(String args[]) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); Scanner sc = new Scanner(System.in); System.out.println("I.S.R. - "+(char)isr.read()); System.out.println("Scanner - " + sc.nextLine()); } }

Trong trường hợp này InputStreamReader chỉ đọc một ký tự cho đầu vào “hello” và “ello” còn lại vẫn nằm trong luồng System.in và những ký tự này được in bởi sc.nextLine ();

Phần kết luận:

BufferedReader đọc một vài ký tự (ngay cả khi chúng ta chỉ muốn một ký tự, nó sẽ đọc nhiều hơn thế) từ Dòng đầu vào và lưu trữ chúng trong bộ đệm. Đó là lý do tại sao nó được gọi là BufferedReader. Tôi không thể biết nó đọc được bao nhiêu ký tự trong một lượt. Nó thay đổi từ 3 đến 10 khi tôi kiểm tra nó cho câu trả lời này.

InputStreamReader chỉ đọc một ký tự từ luồng đầu vào và các ký tự còn lại vẫn còn trong luồng. Không có bộ đệm trung gian trong trường hợp này.

Khi một hoặc nhiều Luồng hoặc đối tượng muốn đọc các ký tự từ System.in thì trong trường hợp đó, InputStreamReader nên được sử dụng vì nó chỉ đọc một ký tự và phần còn lại có thể được sử dụng bởi các đối tượng hoặc luồng khác.

BufferedReader nhanh vì nó duy trì một bộ đệm và việc truy xuất dữ liệu từ bộ đệm luôn nhanh hơn so với việc lấy dữ liệu từ disk / stdin.

7 hữu ích 4 bình luận chia sẻ