Tìm hiểu về lớp Scanner trong Java: Thu thập dữ liệu từ người dùng
Lớp Scanner là một công cụ mạnh mẽ thuộc gói java.util của Java, được thiết kế để đơn giản hóa việc đọc dữ liệu đầu vào. Mặc dù có thể đọc từ nhiều nguồn khác nhau như tệp hoặc chuỗi ký tự, cách sử dụng phổ biến nhất của Scanner là lấy dữ liệu từ bàn phím người dùng thông qua luồng nhập chuẩn (System.in).
Quy trình làm việc với Scanner
Để sử dụng Scanner một cách hiệu quả, bạn sẽ tuân theo các bước cơ bản sau:
- Nhập lớp
Scanner: Đảm bảo lớp này được import vào tệp mã nguồn của bạn. - Khởi tạo đối tượng
Scanner: Tạo một thể hiện (instance) của lớpScanner, thường liên kết vớiSystem.in. - Đọc dữ liệu: Sử dụng các phương thức có sẵn của đối tượng
Scannerđể thu thập thông tin theo kiểu dữ liệu mong muốn. - Đóng đối tượng
Scanner: Giải phóng tài nguyên hệ thống sau khi hoàn tất việc đọc.
1. Nhập lớp
Dòng mã sau cần được đặt ở đầu tệp Java của bạn:
import java.util.Scanner;
2. Khởi tạo đối tượng
Để bắt đầu đọc dữ liệu, bạn cần tạo một đối tượng Scanner. Đối số System.in cho biết Scanner sẽ đọc từ luồng nhập chuẩn:
Scanner inputReader = new Scanner(System.in);
3. Các phương thức đọc dữ liệu phổ biến
Đối tượng Scanner cung cấp nhiều phương thức để đọc các kiểu dữ liệu khác nhau:
nextInt(): Đọc một giá trị số nguyên (int).nextDouble(): Đọc một giá trị số thực dấu phẩy động (double).nextBoolean(): Đọc một giá trị boolean (truehoặcfalse).next(): Đọc một chuỗi ký tự (token) cho đến khi gặp ký tự khoảng trắng đầu tiên.nextLine(): Đọc toàn bộ dòng văn bản, bao gồm cả khoảng trắng, cho đến khi gặp ký tự xuống dòng.
4. Đóng đối tượng Scanner
Việc đóng đối tượng Scanner bằng phương thức close() là một thực hành tốt. Điều này giúp giải phóng các tài nguyên hệ thống mà nó đang giữ, ngăn chặn rò rỉ tài nguyên, đặc biệt quan trọng trong các ứng dụng lớn:
inputReader.close();
Phân biệt next() và nextLine()
Sự khác biệt chính giữa next() và nextLine() nằm ở cách chúng xử lý khoảng trắng và ký tự xuống dòng:
next(): Phương thức này chỉ đọc một "token" (chuỗi ký tự không chứa khoảng trắng). Nó sẽ dừng lại ngay khi gặp bất kỳ ký tự khoảng trắng nào (như dấu cách, tab, hoặc ký tự xuống dòng). Ví dụ, nếu người dùng nhập "Hello World",next()sẽ chỉ đọc "Hello".nextLine(): Phương thức này đọc toàn bộ dòng nhập liệu từ người dùng, bao gồm tất cả các khoảng trắng, cho đến khi nó gặp ký tự xuống dòng (khi người dùng nhấn Enter). Ví dụ, nếu người dùng nhập "Hello World",nextLine()sẽ đọc "Hello World".
Lưu ý quan trọng khi trộn các phương thức đọc: Khi bạn sử dụng các phương thức như nextInt(), nextDouble() hoặc next(), chúng chỉ đọc giá trị mong muốn và để lại ký tự xuống dòng còn sót lại trong bộ đệm nhập liệu. Nếu ngay sau đó bạn gọi nextLine(), nó sẽ đọc ngay ký tự xuống dòng này và bỏ qua việc yêu cầu dữ liệu thực sự mà bạn mong đợi. Để giải quyết vấn đề này, hãy thêm một lệnh inputReader.nextLine(); trống sau các phương thức đọc số hoặc next() để "tiêu thụ" ký tự xuống dòng còn sót lại.
Ví dụ thực hành với Scanner
Hãy xem xét một ví dụ thu thập thông tin cơ bản từ người dùng để minh họa cách sử dụng các phương thức của Scanner:
import java.util.Scanner;
public class ThucHienScanner {
public static void main(String[] args) {
Scanner dataReader = new Scanner(System.in);
// Đọc tên gọi (một từ) bằng next()
System.out.print("Vui lòng nhập tên gọi của bạn (chỉ một từ): ");
String tenGoi = dataReader.next();
// Đọc tuổi bằng nextInt()
System.out.print("Nhập tuổi của bạn: ");
int soTuoi = dataReader.nextInt();
// *** Rất quan trọng: Tiêu thụ ký tự xuống dòng còn sót lại sau nextInt()
dataReader.nextLine(); // Tránh lỗi bỏ qua nextLine() tiếp theo
// Đọc một mô tả đầy đủ bằng nextLine()
System.out.print("Nhập một mô tả ngắn về bản thân (có thể có khoảng trắng): ");
String moTa = dataReader.nextLine();
System.out.println("\n--- Thông tin người dùng đã nhập ---");
System.out.println("Tên gọi: " + tenGoi);
System.out.println("Tuổi: " + soTuoi);
System.out.println("Mô tả: " + moTa);
// Đóng Scanner khi không còn sử dụng
dataReader.close();
}
}
Làm việc với lớp Random trong Java: Tạo số ngẫu nhiên
Lớp Random, cũng nằm trong gói java.util, cung cấp các phương tiện để tạo ra các số giả ngẫu nhiên. Chúng được gọi là "giả ngẫu nhiên" vì chúng được tạo ra dựa trên một thuật toán toán học deterministic sử dụng một "hạt giống" (seed) ban đầu. Nếu không cung cấp hạt giống cụ thể, Java sẽ sử dụng thời gian hiện tại của hệ thống làm hạt giống, làm cho chuỗi số ngẫu nhiên dường như khác nhau mỗi lần chạy chương trình.
Các bước sử dụng Random
Để tạo số ngẫu nhiên, bạn cần thực hiện các bước sau:
- Nhập lớp
Random: Đảm bảo lớp này được import vào tệp mã nguồn của bạn. - Khởi tạo đối tượng
Random: Tạo một thể hiện của lớpRandom. - Sử dụng đối tượng
Random: Gọi các phương thức để tạo ra các loại số ngẫu nhiên mong muốn.
Không cần đóng đối tượng Random vì nó không liên quan đến việc quản lý tài nguyên I/O như Scanner.
1. Nhập lớp
import java.util.Random;
2. Khởi tạo đối tượng
Tạo một đối tượng Random:
Random randomNumberGenerator = new Random();
3. Các phương thức tạo số ngẫu nhiên
Bạn có thể tạo các loại số ngẫu nhiên khác nhau:
nextInt(): Trả về một số nguyên ngẫu nhiên trong toàn bộ phạm vi giá trị củaint.nextInt(int bound): Trả về một số nguyên ngẫu nhiên từ 0 (bao gồm) đếnbound - 1(bao gồm).nextDouble(): Trả về một số thực dấu phẩy động ngẫu nhiên từ 0.0 (bao gồm) đến 1.0 (không bao gồm).nextBoolean(): Trả về một giá trị boolean ngẫu nhiên (truehoặcfalse).
Ví dụ thực hành với Random
Hãy xem xét một chương trình đơn giản tạo ra một "số bí mật" để minh họa việc tạo số ngẫu nhiên:
import java.util.Random;
public class SoNgauNhienViDu {
public static void main(String[] args) {
Random generator = new Random();
// Tạo một số nguyên ngẫu nhiên từ 1 đến 100
// generator.nextInt(100) tạo số từ 0 đến 99. Cộng thêm 1 để có 1 đến 100.
int soBiMat = generator.nextInt(100) + 1;
System.out.println("Chào mừng bạn! Tôi đã tạo một số ngẫu nhiên.");
System.out.println("Số bí mật từ 1 đến 100 là: " + soBiMat);
}
}
Tạo số ngẫu nhiên trong các phạm vi khác
Bạn có thể điều chỉnh để tạo số ngẫu nhiên trong các phạm vi cụ thể:
- Số nguyên ngẫu nhiên từ 50 đến 150:
int valueInRange = generator.nextInt(101) + 50; // nextInt(101) tạo 0-100, cộng 50 để có 50-150 - Số thực ngẫu nhiên từ 0.0 đến 1.0 (chuẩn):
double randomDecimal = generator.nextDouble(); // Trả về 0.0 (bao gồm) đến 1.0 (không bao gồm)