Java: I/O từ Command Line


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

Một chương trình thường được chạy từ dòng lệnh và tương tác với người sử dụng trong môi trường dòng lệnh. Các nền tảng Java hỗ trợ loại tương tác này theo hai cách: thông qua các stream chuẩn và thông qua Cosole.

Các stream chuẩn

Chuẩn Stream là một tính năng của nhiều hệ điều hành. Theo mặc định, chúng đọc vào dữ liệu từ bàn phím và ghi dữ liệu ra màn hình. Chúng cũng hỗ trợ I/O trên các tập tin và giữa các chương trình, nhưng tính năng đó được điều khiển bởi trình thông dịch dòng lệnh mà không phải bởi chương trình.

Các nền tảng Java hỗ trợ ba stream chuẩn: Standard Input, được truy cập thông qua System.inStandard Output, được truy cập thông qua System.out; và Standard Error, được truy cập thông qua System.err. Những đối tượng sẽ được xác định tự động và không cần phải được mở. Các Standard Output và Standard Error đều là những output, có đầu ra lỗi riêng biệt cho phép người dùng chuyển hướng đầu ra thường xuyên vào một tập tin và vẫn có thể đọc được các thông báo lỗi.

Bạn cũng có thể sử dụng các stream chuẩn như là các character stream, nhưng vì lý do lịch sử, cách stream chuẩn lại là những byte stream. System.out và System.err được định nghĩa là những đối tượng PrintStream. Mặc dù là kỹ thuật byte stream, nhưng PrintStream sử dụng một đối tượng character stream nội bộ để mô phỏng các tính năng của các character stream.

Ngược lại, System.in là một byte stream và không có tính năng của character stream. Để sử dụng đầu vào tiêu chuẩn như là một Standard Input thì ta bao System.in trong InputStreamReader như sau:

InputStreamReader cin = new InputStreamReader (System.in);

Console

Một lựa chọn tiên tiến hơn cho các stream chuẩn là Console, đây là một đối tượng đơn và được định sẵn có kiểu Console với hầu hết các tính năng được cung cấp bởi các stream chuẩn bên cạnh những thành phần khác. Console đặc biệt hữu ích cho các mục nhập mật khẩu an toàn. Các đối tượng Console cũng cung cấp các input và output stream cho các character stream thông qua các phương thức readerwriter.

Trước khi một chương trình có thể sử dụng Console, nó phải cố gắng để lấy đối tượng Console bằng cách gọi System.Console(). Nếu đối tượng Console có sẵn thì phương thức này trả về chính nó. Nếu System.Console trả về NULL thì các hoạt động của Console không được phép, có thể hệ điều hành không hỗ trợ hoặc vì chương trình đã được chạy trong một môi trường không tương tác.

Các đối tượng Console hỗ trợ nhập mật khẩu an toàn thông qua phương thức readPassword. Phương thức này giúp nhập mật khẩu an toàn trong hai cách, cách thứ nhất là nó ngăn chặn echoing, vì thế mật khẩu sẽ không hiển thị trên màn hình của người dùng, cách thứ hai là readPassword trả về một mảng ký tự, không phải là một chuỗi, do đó mật khẩu có thể được ghi đè, loại bỏ nó khỏi bộ nhớ ngay khi nó không còn cần thiết.

Dưới đây là ví dụ Password là chương trình nguyên mẫu để thay đổi mật khẩu của người dùng. Nó cũng cho thấy cách sử dụng của một số phương thức Console.

import java.io.Console;
import java.util.Arrays;
import java.io.IOException;

public class Password { 

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

        Console c = System.Console();
        if(c == null) {
            System.err.println("Không có giao diện điều khiển.");
            System.exit(1);
        } 

        String login = c.readLine( "Nhập thông tin đăng nhập: ");
        char [] oldPassword = c.readPassword( "Nhập mật khẩu cũ của bạn: "); 

        if (veryfy(login, oldPassword)) {
            noMatch boolean;
            do {
                char [] newPassword1 = c.readPassword("Nhập mật khẩu mới của bạn: ");
                char [] newPassword2 = c.readPassword("Nhập mật khẩu mới một lần nữa: ");
                noMatch =! Arrays.equals (newPassword1, newPassword2);
                if (noMatch) {
                    c.format( "Mật khẩu không phù hợp. Hãy thử lại.%n");
                } Else {
                    change(login, newPassword1);
                    c.format("Mật khẩu của %s đã thay đổi.%n", login);
                }
                Arrays.fill(newPassword1, '');
                Arrays.fill(newPassword2, '');
            } while(noMatch);
        } 

        Arrays.fill(oldPassword, '');
    } 

    //Tùy ý thay đổi phương pháp.
    boolean veryfy(String login, char[] password) {
        // Phương thức này luôn luôn trả về
        // true trong ví dụ này.
        // Sửa đổi phương pháp này để xác minh
        // mật khẩu theo quy tắc của bạn.
        return true;
    } 

    //Tùy ý thay đổi phương thức.
    static void change(String login, char[] password) {
        // Sửa đổi phương thức này để thay đổi
        // mật khẩu theo quy tắc của bạn.
    }
}

Lớp Password thực thi theo các bước sau:

  1. Cố gắng để lấy đối tượng Console. Nếu đối tượng không có sẵn thì hủy bỏ.

  2. Gọi Console.ReadLine để nhắc và đọc tên đăng nhập của người dùng.

  3. Gọi Console.readPassword để nhắc và đọc mật khẩu hiện tại của người dùng.

  4. Gọi phương thức veryfy để xác nhận rằng người dùng được phép thay đổi mật khẩu (trong ví dụ này, veryfy là một phương thức giả định luôn luôn trả về true).

  5. Lặp lại các bước sau cho đến khi người dùng nhập mật khẩu giống nhau hai lần:

    a. Gọi Console.readPassword hai lần để nhắc nhở cho và đọc một mật khẩu mới.

    b. Nếu người dùng nhập mật khẩu giống nhau cả hai lần, gọi phương thức change để thay đổi nó (change cũng là phương thức tưởng.)

  6. Ghi đè lên cả hai mật khẩu bằng các khoảng trống.

  7. Ghi đè lên các mật khẩu cũ bằng các khoảng trống.

» Tiếp: Data Stream
« Trước: Scanning và Formatting
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!