Bài 9. Hướng Dẫn Cách Nhập Dữ Liệu Từ Bàn Phím Trong Java | Tự Học Java Căn Bản
- Published on

- Sử Dụng Scanner (Phổ biến nhất)
- Các Phương Thức Của Scanner:
- Vấn Đề Khi Dùng nextInt() Hoặc nextDouble() Trước nextLine()
- Ngoài Dữ Liệu Từ Bàn Phím, Scanner Có Thể Đọc Dữ Liệu Từ Đâu?
- Sử Dụng BufferedReader (Hiệu suất cao hơn)
- Sử Dụng Console (Chỉ hoạt động trong terminal)
- Khi Nào Nên Sử Dụng Scanner, BufferedReader hay Console
- Sử Dụng Scanner Nếu:
- Sử Dụng BufferedReader Nếu:
- Sử Dụng Console Nếu:
- Kết Luận
Trong Java, việc nhập dữ liệu từ bàn phím là một bước cơ bản và cần thiết trong quá trình lập trình. Có nhiều cách để nhập dữ liệu từ bàn phím, nhưng phổ biến nhất là sử dụng các lớp Scanner
, BufferedReader
, và Console
. Mỗi phương thức có những ưu điểm và cách sử dụng riêng, tùy thuộc vào yêu cầu của chương trình.
Scanner
(Phổ biến nhất)
Sử Dụng Lớp Scanner
thuộc gói java.util
giúp bạn dễ dàng đọc dữ liệu từ bàn phím. Đây là cách sử dụng đơn giản và dễ tiếp cận nhất đối với các lập trình viên Java.
Scanner
:
Các Phương Thức Của - Nhập số nguyên:
nextInt()
- Nhập số thực:
nextDouble()
- Nhập chuỗi:
next()
vànextLine()
- Nhập ký tự:
next().charAt(0)
Ví dụ:
import java.util.Scanner;
public class InputExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Nhập số nguyên
System.out.print("Nhập một số nguyên: ");
int num = scanner.nextInt();
// Nhập số thực
System.out.print("Nhập một số thực: ");
double decimal = scanner.nextDouble();
// Nhập ký tự
System.out.print("Nhập một ký tự: ");
char ch = scanner.next().charAt(0);
// Xóa bộ nhớ đệm trước khi nhập chuỗi
scanner.nextLine();
// Nhập chuỗi có khoảng trắng
System.out.print("Nhập một chuỗi: ");
String str = scanner.nextLine();
// Hiển thị kết quả
System.out.println("\nBạn đã nhập:");
System.out.println("Số nguyên: " + num);
System.out.println("Số thực: " + decimal);
System.out.println("Ký tự: " + ch);
System.out.println("Chuỗi: " + str);
scanner.close(); // Đóng Scanner để tránh rò rỉ tài nguyên
}
}
Lưu ý:
next()
chỉ đọc một từ, không chứa dấu cách.nextLine()
đọc toàn bộ dòng, bao gồm dấu cách.- Nếu sử dụng
nextInt()
hoặcnextDouble()
trướcnextLine()
, cần phải gọiscanner.nextLine()
để xóa bộ nhớ đệm sau khi đọc số.
nextInt()
Hoặc nextDouble()
Trước nextLine()
Vấn Đề Khi Dùng Khi bạn dùng nextInt()
hoặc nextDouble()
trước nextLine()
, bạn có thể gặp phải lỗi là lệnh nextLine()
không hoạt động như mong đợi, vì nó sẽ nhận ngay ký tự xuống dòng (\n
) còn sót lại trong bộ nhớ đệm. Điều này làm cho phương thức nextLine()
bị bỏ qua.
Ký tự xuống dòng (\n) là kết quả của việc nhấn phím Enter sau khi nhập một giá trị. Khi bạn nhập dữ liệu trong Java, mỗi lần nhấn Enter sẽ tạo ra một ký tự xuống dòng để đánh dấu kết thúc dòng đó.
Ví dụ:
import java.util.Scanner;
public class ScannerProblem {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Nhập tuổi: ");
int age = scanner.nextInt(); // Đọc số nguyên nhưng không lấy dấu xuống dòng
System.out.print("Nhập tên: ");
String name = scanner.nextLine(); // Bị bỏ qua vì đọc phải ký tự `\n` còn trong bộ nhớ đệm!
System.out.println("Tuổi: " + age);
System.out.println("Tên: " + name);
scanner.close();
}
}
Kết quả:
Nhập tuổi: 25
Nhập tên: Tuổi: 25
Tên:
Chương trình không chờ nhập tên, mà name
nhận một chuỗi rỗng vì ký tự xuống dòng đã được đọc trước đó.
Đúng rồi! Cảm ơn bạn đã chỉ ra. Dưới đây là một đoạn viết chi tiết về cách Scanner
có thể đọc dữ liệu từ nhiều nguồn khác nhau, không chỉ từ bàn phím (System.in). Tôi sẽ trình bày cụ thể hơn về cách sử dụng các nguồn nhập khác nhau để đọc dữ liệu trong Java.
Ngoài Dữ Liệu Từ Bàn Phím, Scanner Có Thể Đọc Dữ Liệu Từ Đâu?
Mặc dù System.in
là nguồn nhập phổ biến nhất mà Scanner
sử dụng để đọc dữ liệu từ bàn phím, nhưng Scanner
có thể đọc dữ liệu từ nhiều nguồn khác nhau, bao gồm chuỗi, tệp, hoặc luồng nhập từ mạng và hệ thống. Dưới đây là các ví dụ minh họa:
Đọc Dữ Liệu Từ Chuỗi (String)
Bạn cũng có thể sử dụng Scanner
để đọc dữ liệu từ một chuỗi (String). Điều này hữu ích khi bạn muốn xử lý một chuỗi có sẵn thay vì nhập trực tiếp từ bàn phím.
Ví dụ:
import java.util.Scanner;
public class ScannerFromString {
public static void main(String[] args) {
String input = "Hello Java";
Scanner scanner = new Scanner(input); // Đọc dữ liệu từ chuỗi
while (scanner.hasNext()) {
System.out.println(scanner.next()); // Đọc từng từ trong chuỗi
}
scanner.close();
}
}
Đọc Dữ Liệu Từ Tệp (File)
Scanner
cũng có thể đọc dữ liệu từ các tệp văn bản. Bạn chỉ cần truyền đối tượng File
vào constructor của Scanner
. Điều này giúp bạn xử lý dữ liệu trong tệp mà không cần phải mở tệp thủ công.
Ví dụ:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ScannerFromFile {
public static void main(String[] args) {
try {
File file = new File("data.txt"); // Tạo đối tượng File cho tệp
Scanner scanner = new Scanner(file); // Đọc dữ liệu từ tệp
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine()); // Đọc từng dòng trong tệp
}
scanner.close();
} catch (FileNotFoundException e) {
System.out.println("Tệp không tìm thấy!");
}
}
}
Đọc Dữ Liệu Từ Luồng Nhập (InputStream)
Scanner
cũng có thể đọc dữ liệu từ các luồng nhập (InputStream), như khi đọc dữ liệu từ một tệp hoặc từ mạng. Bạn có thể sử dụng FileInputStream
hoặc các luồng nhập khác để cấp dữ liệu cho Scanner
.
Ví dụ:
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;
public class ScannerFromInputStream {
public static void main(String[] args) {
try {
InputStream inputStream = new FileInputStream("data.txt"); // Tạo luồng nhập từ tệp
Scanner scanner = new Scanner(inputStream); // Đọc dữ liệu từ luồng nhập
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine()); // Đọc từng dòng từ luồng nhập
}
scanner.close();
} catch (IOException e) {
System.out.println("Lỗi khi đọc tệp!");
}
}
}
BufferedReader
(Hiệu suất cao hơn)
Sử Dụng Lớp BufferedReader
là một lựa chọn khác có hiệu suất cao hơn Scanner
. Tuy nhiên, bạn cần xử lý ngoại lệ IOException
và phải chuyển đổi kiểu dữ liệu khi sử dụng.
Ví dụ:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BufferedReaderExample {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// Nhập chuỗi
System.out.print("Nhập chuỗi: ");
String str = reader.readLine();
// Nhập số nguyên
System.out.print("Nhập số nguyên: ");
int num = Integer.parseInt(reader.readLine());
// Nhập số thực
System.out.print("Nhập số thực: ");
double decimal = Double.parseDouble(reader.readLine());
// Hiển thị kết quả
System.out.println("\nBạn đã nhập:");
System.out.println("Chuỗi: " + str);
System.out.println("Số nguyên: " + num);
System.out.println("Số thực: " + decimal);
}
}
Lưu ý:
readLine()
trả về một chuỗi và bạn cần sử dụngInteger.parseInt()
hoặcDouble.parseDouble()
để chuyển đổi kiểu dữ liệu.
Console
(Chỉ hoạt động trong terminal)
Sử Dụng Lớp Console
thuộc System
chỉ hoạt động trong môi trường terminal, không hỗ trợ trong các IDE như Eclipse hoặc IntelliJ. Console
hữu ích khi bạn cần nhập dữ liệu một cách bảo mật, ví dụ như mật khẩu.
Ví dụ:
import java.io.Console;
public class ConsoleExample {
public static void main(String[] args) {
Console console = System.console();
if (console == null) {
System.out.println("Không hỗ trợ Console trong IDE!");
return;
}
// Nhập chuỗi
String name = console.readLine("Nhập tên của bạn: ");
// Nhập mật khẩu (dạng ẩn)
char[] password = console.readPassword("Nhập mật khẩu: ");
System.out.println("Chào, " + name);
}
}
Lưu ý:
System.console()
trả vềnull
khi chạy trong IDE.readPassword()
cho phép nhập mật khẩu mà không hiển thị ký tự, giúp bảo mật tốt hơn.
Scanner
, BufferedReader
hay Console
Khi Nào Nên Sử Dụng Scanner
Nếu:
Sử Dụng - Bạn đang viết ứng dụng chạy trong IDE (Eclipse, IntelliJ, NetBeans, VS Code,...).
- Bạn cần nhập nhiều loại dữ liệu khác nhau như
int
,double
,char
,String
. - Bạn cần nhập chuỗi có khoảng trắng (dùng
nextLine()
). - Bạn không yêu cầu hiệu suất quá cao, vì
Scanner
có thể hơi chậm khi xử lý dữ liệu lớn.
BufferedReader
Nếu:
Sử Dụng - Bạn đang viết ứng dụng có yêu cầu hiệu suất cao, đặc biệt khi phải xử lý lượng dữ liệu lớn.
- Bạn chỉ cần đọc chuỗi hoặc số nguyên/số thực và không cần xử lý nhiều loại dữ liệu phức tạp.
- Bạn muốn làm việc với các luồng dữ liệu khác như đọc tệp hoặc luồng mạng.
- Bạn không quá quan tâm đến tính dễ sử dụng và sẵn sàng xử lý ngoại lệ
IOException
cùng việc chuyển đổi kiểu dữ liệu (nhưInteger.parseInt()
hoặcDouble.parseDouble()
).
Console
Nếu:
Sử Dụng - Bạn đang viết ứng dụng chạy trong terminal (command line) mà không cần IDE.
- Bạn cần nhập mật khẩu an toàn mà không hiển thị ký tự, sử dụng
readPassword()
. - Bạn không cần đọc nhiều loại dữ liệu số (vì
Console
chỉ đọc chuỗi, nếu muốn sử dụng số bạn phải tự chuyển đổi kiểu). - Bạn không có yêu cầu sử dụng IDE và muốn ứng dụng chỉ chạy trong môi trường dòng lệnh.
Kết Luận
Trong Java, việc nhập dữ liệu từ bàn phím có thể thực hiện qua các lớp Scanner
, BufferedReader
, và Console
.
Scanner
là lựa chọn phổ biến nhất vì dễ sử dụng và hỗ trợ nhiều loại dữ liệu.BufferedReader
hiệu suất cao hơn và thích hợp với các ứng dụng cần xử lý tốc độ cao.Console
bảo mật tốt, nhưng chỉ hoạt động trong môi trường terminal và không hỗ trợ trong IDE.
Việc chọn phương thức nhập dữ liệu phụ thuộc vào yêu cầu cụ thể của ứng dụng và môi trường phát triển bạn đang sử dụng.
Bài tiếp theo: Bài 10. Chuyển đổi kiểu dữ liệu trong Java
Bài viết mới nhất
Bài 26. Cách Sử Dụng break, continue và return Trong Java | Tự Học Java Căn Bản
Hướng dẫn cách sử dụng câu lệnh break, continue và return trong Java để kiểm soát vòng lặp và luồng thực thi chương trình hiệu quả.
Bài 25. Vòng Lặp do-while Trong Java | Tự Học Java Căn Bản
Hướng dẫn chi tiết về vòng lặp do-while trong Java, cách sử dụng, cú pháp, ví dụ minh họa và so sánh với vòng lặp while.
Bài 24. Cách Chuyển Đổi Số Từ Thập Phân Sang Nhị Phân Trong Java | Tự Học Java Căn Bản
Hướng dẫn cách chuyển đổi số từ hệ thập phân sang hệ nhị phân trong Java bằng nhiều phương pháp khác nhau, kèm theo ví dụ minh họa.
Bài 23. Cách Sử Dụng Vòng Lặp While Trong Java | Tự Học Java Căn Bản
Tìm hiểu cách sử dụng vòng lặp while trong Java với cú pháp, ví dụ thực tế và ứng dụng trong lập trình Java.
Bài viết liên quan
Bài 26. Cách Sử Dụng break, continue và return Trong Java | Tự Học Java Căn Bản
Hướng dẫn cách sử dụng câu lệnh break, continue và return trong Java để kiểm soát vòng lặp và luồng thực thi chương trình hiệu quả.
Bài 25. Vòng Lặp do-while Trong Java | Tự Học Java Căn Bản
Hướng dẫn chi tiết về vòng lặp do-while trong Java, cách sử dụng, cú pháp, ví dụ minh họa và so sánh với vòng lặp while.
Bài 24. Cách Chuyển Đổi Số Từ Thập Phân Sang Nhị Phân Trong Java | Tự Học Java Căn Bản
Hướng dẫn cách chuyển đổi số từ hệ thập phân sang hệ nhị phân trong Java bằng nhiều phương pháp khác nhau, kèm theo ví dụ minh họa.
Bài 23. Cách Sử Dụng Vòng Lặp While Trong Java | Tự Học Java Căn Bản
Tìm hiểu cách sử dụng vòng lặp while trong Java với cú pháp, ví dụ thực tế và ứng dụng trong lập trình Java.
