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
Thuộc danh mục: Học Java Căn Bản|Đăng bởi: Lê Thanh Giang||9 min read
Facebook share iconLinkedIn share iconTwitter share iconPinterest share iconTumblr share icon
Bài 9. Cách Nhập Dữ Liệu Từ Bàn Phím Với Chương Trình Java | Tự Học Java Căn Bả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.

Sử Dụng Scanner (Phổ biến nhất)

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.

Các Phương Thức Của Scanner:

  • Nhập số nguyên: nextInt()
  • Nhập số thực: nextDouble()
  • Nhập chuỗi: next()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ặc nextDouble() trước nextLine(), cần phải gọi scanner.nextLine() để xóa bộ nhớ đệm sau khi đọc số.

Vấn Đề Khi Dùng nextInt() Hoặc nextDouble() Trước nextLine()

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!");
        }
    }
}

Sử Dụng BufferedReader (Hiệu suất cao hơn)

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ụng Integer.parseInt() hoặc Double.parseDouble() để chuyển đổi kiểu dữ liệu.

Sử Dụng Console (Chỉ hoạt động trong terminal)

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.

Khi Nào Nên Sử Dụng Scanner, BufferedReader hay Console

Sử Dụng Scanner Nếu:

  • 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.

Sử Dụng BufferedReader Nếu:

  • 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ặc Double.parseDouble()).

Sử Dụng Console Nếu:

  • 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 viết liên quan

Newsletter border

Đăng ký để nhận tin từ RiverLee