Class Scanner trong Java là class giúp chúng ta có thể đọc dữ liệu từ nhiều nguồn khác nhau như người dùng nhập vào khi chạy ứng dụng, các tập tin. Trong bài viết này, mình sẽ hướng dẫn các bạn cách đọc thông tin mà người dùng nhập vào sử dụng class Scanner này các bạn nhé!
Đầu tiên, chúng ta sẽ khởi tạo đối tượng của class Scanner này trước.
Class Scanner có nhiều constructor khác nhau. Để nhận dữ liệu do người dùng nhập vào, các bạn hãy khởi tạo đối tượng này với constructor là một standard input stream là System.in các bạn nhé:
1 |
Scanner scanner = new Scanner(System.in); |
Dữ liệu mà người dùng nhập vào có thể là một chuỗi hoặc là một số nên class Scanner cũng có những phương thức tương ứng để hỗ trợ điều này, như sau:
- nextLine()
- next()
- nextInt()
- nextLong()
- nextFloat()
- nextDouble()
- nextBoolean()
- nextByte()
- nextShort()
- nextBigInteger()
- nextBigDecimal()
Nếu dữ liệu là một số integer, các bạn có thể sử dụng phương thức nextInt() hoặc nextByte() hoặc nextShort() hoặc nextLong() hoặc nextBigInteger() để đọc dữ liệu này. Tùy theo thông tin nhập vào, các bạn có thể sử dụng các phương thức phù hợp để chương trình có thể đọc được giá trị đó.
Ví dụ để đọc thông tin tuổi của một người, các bạn có thể sử dụng phương thức nextByte() (kiểu dữ liệu byte với range giá trị từ -128 đến 127) như sau:
1 2 3 4 |
System.out.println("Enter your age:"); int age = scanner.nextInt(); System.out.println("Your age is " + age); |
Kết quả khi chạy ví dụ trên như sau:
Để đọc kiểu dữ liệu thập phân thì các bạn có thể sử dụng các phương thức nextDouble(), nextFloat(), nextBigDecimal(). Ví dụ như sau:
1 2 3 4 |
System.out.println("Enter your test score:"); float score = scanner.nextFloat(); System.out.println("Your test score is " + score); |
Kết quả:
Với kiểu dữ liệu nhập vào là boolean, các bạn có thể sử dụng phương thức nextBoolean(), ví dụ như sau:
1 2 3 4 |
System.out.println("Is it true?"); boolean bool = scanner.nextBoolean(); System.out.println("Result: " + bool); |
Kết quả:
Đối với kiểu dữ liệu nhập vào là chuỗi, class Scanner hỗ trợ chúng ta 2 phương thức là next() và nextLine(). Sự khác nhau của 2 phương thức này đó là: phương thức next() sẽ đọc từng từ một từ input của người dùng, còn nextLine() sẽ đọc nguyên chuỗi trên cùng 1 dòng của người dùng.
Ví dụ, nếu các bạn sử dụng phương thức next() để đọc thông tin như sau:
1 2 3 4 |
System.out.println("Enter your word: "); String s = scanner.next(); System.out.println("Result: " + s); |
thì khi chạy ví dụ này, nếu các bạn nhập “Khanh” thì kết quả sẽ in dòng chữ “Result: Khanh”:
Nhưng nếu các bạn nhập “Huong Dan Java” thì kết quả chỉ là “Huong” mà thôi:
Đó là bởi vì phương thức next() chỉ đọc từng từ một từ dữ liệu mà các bạn nhập vào. Muốn đọc hết dòng chữ “Huong Dan Java” ở trên, các bạn cần phải thêm code để đọc từng từ này. Ví dụ, mình sẽ viết thêm code như sau:
1 2 3 4 5 6 |
System.out.println("Enter your word: "); String s = scanner.next(); String s1 = scanner.next(); String s2 = scanner.next(); System.out.println("Result: " + s + " " + s1 + " " + s2); |
Kết quả:
Nếu các bạn sử dụng phương thức nextLine() thì các bạn chỉ cần viết code như sau để đọc dòng chữ “Huong Dan Java” được nhập từ người dùng:
1 2 3 4 |
System.out.println("Enter your word: "); String s = scanner.nextLine(); System.out.println("Result: " + s); |
Phương thức nextLine() sẽ lấy ký tự xuống dòng hoặc enter để đánh dấu việc kết thúc của một dòng và trả về dữ liệu của dòng đó.
Kết quả:
Một lưu ý mà các bạn cần phải biết là: chỉ có phương thức nextLine() sẽ đọc nội dung mà người dùng nhập vào kể cả ký tự xuống dòng hoặc enter để trả về kết quả. Còn tất cả các phương thức next…() còn lại, chỉ có giá trị người dùng nhập vào được trả về, các ký tự xuống dòng hoặc enter vẫn còn trong input buffer. Nên nếu các bạn, ví dụ như sử dụng phương thức nextLine() sau khi call sử dụng phương thức nextInt():
1 2 3 4 5 6 7 8 9 10 11 12 |
System.out.println("Enter your word: "); String s = scanner.nextLine(); System.out.println("Enter your age: "); int age = scanner.nextInt(); System.out.println("Enter your name: "); String name = scanner.nextLine(); System.out.println("Word: " + s); System.out.println("Age: " + age); System.out.println("Name: " + name); |
khi chạy ví dụ trên, sau khi nhập tuổi, các bạn sẽ thấy chương trình sẽ kết thúc mà không cho chúng ta nhập tên:
Nguyên nhân của việc này đó là bởi vì sau khi chúng ta nhập tuổi, phương thức nextLine() kế tiếp sẽ đọc ký tự xuống dòng hoặc enter mà phương thức nextInt() không đọc, để gán cho biến name ở trên.
Để giải quyết vấn đề này, các bạn có thể gọi thêm một phương thức nextLine() sau phương thức nextInt() ở trên để đọc ký tự xuống dòng hoặc enter trong input buffer, sau đó thì mới call tiếp phương thức nextLine() khác để nhập thông tin tên. Ví dụ như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
System.out.println("Enter your word: "); String s = scanner.nextLine(); System.out.println("Enter your age: "); int age = scanner.nextInt(); scanner.nextLine(); System.out.println("Enter your name: "); String name = scanner.nextLine(); System.out.println("Word: " + s); System.out.println("Age: " + age); System.out.println("Name: " + name); |
Kết quả khi các bạn chạy lại ví dụ này như sau:
Một cách khác để giải quyết vấn đề này là các bạn luôn sử dụng phương thức nextLine() để đọc thông tin được nhập từ người dùng. Sau đó thì parse thông tin này sang kiểu dữ liệu mà chúng ta muốn. Ví dụ như sau:
1 2 3 4 5 6 7 8 9 10 11 12 |
System.out.println("Enter your word: "); String s = scanner.nextLine(); System.out.println("Enter your age: "); int age = Integer.parseInt(scanner.nextLine()); System.out.println("Enter your name: "); String name = scanner.nextLine(); System.out.println("Word: " + s); System.out.println("Age: " + age); System.out.println("Name: " + name); |
Kết quả vẫn như vậy:
Class Scanner cũng có các phương thức has…() cho phép chúng ta có thể kiểm tra xem có dữ liệu được nhập vào từ người dùng hay không? Sau đó thì mới đọc nội dung này. Ví dụ như sau:
1 2 3 4 5 |
while (scanner.hasNextLine()) { String s = scanner.nextLine(); System.out.println("You just entered: " + s); } |
Kết quả: