Spec-Zone .ru
спецификации, руководства, описания, API
След: Существенные Классы
Урок: Основной ввод-вывод
Раздел: Потоки ввода-вывода
Ввод-вывод из Командной строки
Домашняя страница > Существенные Классы > Основной ввод-вывод

Ввод-вывод из Командной строки

Программа часто выполняется из командной строки и взаимодействует с пользователем в среде командной строки. Платформа Java поддерживает этот вид взаимодействия двумя способами: через Стандартные Потоки и через Консоль.

Стандартные Потоки

Стандартные Потоки являются функцией многих операционных систем. По умолчанию они читают ввод из клавиатуры и вывод записи к дисплею. Они также поддерживают ввод-вывод на файлах и между программами, но той функцией управляет интерпретатор командной строки, не программа.

Платформа Java поддерживает три Стандартных Потока: Стандартный Ввод, к которому получают доступ через System.in; Стандартный вывод, к которому получают доступ через System.out; и Стандартная Ошибка, к которой получают доступ через System.err. Эти объекты определяются автоматически и не должны быть открыты. Стандартный вывод и Стандартная Ошибка оба для вывода; наличие вывода ошибок отдельно позволяет пользователю отклонять регулярный вывод к файлу и все еще быть в состоянии считать сообщения об ошибках. Для получения дополнительной информации сошлитесь на документацию для Вашего интерпретатора командной строки.

Вы могли бы ожидать, что Стандартные Потоки будут символьными потоками, но, по историческим причинам, они - потоки байтов. System.out и System.err определяются как PrintStream объекты. Хотя это - технически поток байтов, PrintStream использует внутренний символьный потоковый объект, чтобы эмулировать многие из функций символьных потоков.

В отличие от этого, System.in поток байтов без символьных потоковых функций. Использовать Стандартный Ввод в качестве символьного потока, обертки System.in в InputStreamReader.

InputStreamReader cin = new InputStreamReader(System.in);

Консоль

Более усовершенствованной альтернативой Стандартным Потокам является Консоль. Это - единственный, предопределенный объект типа Console у этого есть большинство функций, обеспеченных Стандартными Потоками, и другими кроме того. Консоль особенно полезна для безопасного ввода пароля. Консольный объект также обеспечивает потоки ввода и вывода, которые являются истинными символьными потоками через reader и writer методы.

Прежде, чем программа может использовать Консоль, она должна попытаться получить Консольный объект, вызывая System.console(). Если Консольный объект доступен, этот метод возвращает его. Если System.console возвраты NULL, тогда Консольные операции не разрешаются, или потому что ОС не поддерживает их или потому что программа была запущена в неинтерактивной среде.

Консольный объект поддерживает безопасный ввод пароля через readPassword метод. Этот метод помогает защитить ввод пароля двумя способами. Во-первых, это подавляет повторение, таким образом, пароль не видим на экране пользователя. Во-вторых, readPassword возвращает символьный массив, не a String, таким образом, пароль может быть перезаписан, удаляя это из памяти, как только это больше не необходимо.

Password примером является прототипная программа для того, чтобы изменить пароль пользователя. Это демонстрирует несколько 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("No console.");
            System.exit(1);
        }

        String login = c.readLine("Enter your login: ");
        char [] oldPassword = c.readPassword("Enter your old password: ");

        if (verify(login, oldPassword)) {
            boolean noMatch;
            do {
                char [] newPassword1 = c.readPassword("Enter your new password: ");
                char [] newPassword2 = c.readPassword("Enter new password again: ");
                noMatch = ! Arrays.equals(newPassword1, newPassword2);
                if (noMatch) {
                    c.format("Passwords don't match. Try again.%n");
                } else {
                    change(login, newPassword1);
                    c.format("Password for %s changed.%n", login);
                }
                Arrays.fill(newPassword1, ' ');
                Arrays.fill(newPassword2, ' ');
            } while (noMatch);
        }

        Arrays.fill(oldPassword, ' ');
    }
    
    // Dummy change method.
    static boolean verify(String login, char[] password) {
        // This method always returns
        // true in this example.
        // Modify this method to verify
        // password according to your rules.
        return true;
    }

    // Dummy change method.
    static void change(String login, char[] password) {
        // Modify this method to change
        // password according to your rules.
    }
}

Password class следует за этими шагами:

  1. Попытка получить Консольный объект. Если объект не доступен, аварийное прекращение работы.
  2. Вызвать Console.readLine запрашивать и читать имя для входа в систему пользователя.
  3. Вызвать Console.readPassword запрашивать и читать существующий пароль пользователя.
  4. Вызвать verify подтвердить, что пользователь разрешается изменить пароль. (В этом примере, verify фиктивный метод, который это всегда возвращает true.)
  5. Повторите следующие шаги, пока пользователь не вводит тот же самый пароль дважды:
    1. Вызвать Console.readPassword дважды запрашивать и читать новый пароль.
    2. Если пользователь, введенный тот же самый пароль оба раза, вызвать change изменить это. (Снова, change фиктивный метод.)
    3. Перезапишите оба пароля с пробелами.
  6. Перезапишите старый пароль с пробелами.

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Форматирование
Следующая страница: Потоки данных