2010-11-17 2 views
63

Я использовал readLine из BufferedReader, чтобы получить ввод/новый пароль от пользователя, но хотел скрыть пароль, поэтому я пытаюсь использовать класс java.io.Console. Проблема в том, что System.console() возвращает null, когда приложение отлаживается в Eclipse. Я новичок в Java и Eclipse не уверен, что это лучший способ достичь? Я нажимаю правой кнопкой мыши на исходный файл и выбираю «Debug As»> «Java Application». Есть ли обходной путь?System.console() возвращает null

+1

Также см. Http://stackoverflow.com/questions/26470972/trying-to-read-from-console-java/26473083#26473083. Я определил 'System.out' и' System.in' достаточным для мой вариант использования и не используется с помощью 'System.console()'. – OneWorld

ответ

0

Это правильно.

Вам нужно будет запустить приложение вне Eclipse. Посмотрите на панели конфигурации пусковой установки в Eclipse и посмотрите, можете ли вы определить параметр, который говорит, чтобы запустить команду в отдельной JVM.

1

Я считаю, что в конфигурациях запуска для Eclipse вы можете настроить, следует ли назначать консоль или нет - убедитесь, что это отмечено. (Прошло некоторое время с тех пор, как я использовал Eclipse, поэтому я не могу дать конкретные инструкции, которых я боюсь).

Если это не сработает, то то, что определенно сделает это задание, запустит ваше приложение в режиме отладки, а затем подключится к процессу с помощью Eclipse. Найдите «удаленную отладку eclipse», если вы не знаете, как это сделать.

Кроме того, в общем, это плохая идея: требует пульта, который будет назначен, поскольку это очень сильно влияет на гибкость вашего приложения - как вы только что обнаружили. Многие способы вызова Java не будут назначать консоль, и ваше приложение не будет использоваться в этих случаях (что плохо). Возможно, вы могли бы альтернативно разрешить аргументы в командной строке. (Если вы тестируете вход в консоль конкретно, то достаточно справедливы, но потенциально может быть полезно, чтобы люди могли вызывать ваше приложение из сценариев и/или на безгласных серверах, поэтому такой гибкий дизайн почти всегда является хорошей идеей . это часто приводит к более организованному коду, тоже)

+0

Да, это только для моей цели отладки, пользователи получат сценарий оболочки или файл bat. Разве это не gud использовать консоль? если да, то что является лучшим способом – Gauls

+0

BTW все удаленные отладочные поисковые запросы abt web server, но я не создаю веб-приложение. это простая Java. может быть лучший способ маскировки пароля? – Gauls

+0

Вы можете удаленно отлаживать любой процесс Java, просто добавьте, например. '-Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = n, address = 8000' для аргументов VM (по крайней мере, для Sun JVM). Использование консоли может быть в порядке, но, как указано, означает, что ваш код просто * не будет работать * при запуске без него. Вместо этого рассмотрите возможность передачи значений, непосредственно полученных из аргументов командной строки, свойств системы, файлов свойств и т. Д. По крайней мере, предоставляйте некоторую альтернативу - например, переходите только к консоли, если значение * не было * предоставлено в качестве аргумента командной строки. –

6

Согласно docs:.

Если виртуальная машина запускается автоматически, например, с помощью фона планировщика заданий, то он, как правило, не имеет консоль.

+1

Этот ответ заставил меня найти, что если вы используете Gradle с включенным deamon, вы не сможете получить консоль в своих задачах Gradle. Выполнение моей задачи Gradle с помощью «-no-daemon» позволяет использовать консоль. – whitespy9

+0

Это случилось со мной при использовании капельницы (https://github.com/ninjudd/drip) для инструмента командной строки. К сожалению! –

11

System.console() возвращение null если нет консоли.

Вы можете обойти это либо adding a layer of indirection to your code, либо путем запуска кода на внешней консоли и attaching a remote debugger.

+0

Он также возвратил null для меня в PowerShell при запуске чего-то вроде 'java -cp ... Class | tee вне'. –

-1

добавить -console в ваших аргументов программы для запуска OSGi консоли

+1

, пожалуйста, проясните подробнее об этом, если это возможно, пример? – Gauls

27

Этот фрагмент кода должен сделать трюк:

private String readLine(String format, Object... args) throws IOException { 
    if (System.console() != null) { 
     return System.console().readLine(format, args); 
    } 
    System.out.print(String.format(format, args)); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(
      System.in)); 
    return reader.readLine(); 
} 

private char[] readPassword(String format, Object... args) 
     throws IOException { 
    if (System.console() != null) 
     return System.console().readPassword(format, args); 
    return this.readLine(format, args).toCharArray(); 
} 

Хотя тестирование в Eclipse, , ваш пароль будет отображаться в ясном виде. По крайней мере, вы сможете протестировать. Просто не вводите свой реальный пароль во время тестирования. Держите это для использования в производстве;).

+0

Если ваш ручной метод 'readLine' закрывает' BufferedReader' в блоке finally (или try-with-resources)? –

+0

Нет, потому что это закроет совпадение потока 'System.in', после чего последующее чтение не будет выполнено. – formixian

+0

Да, странно, что этот поток можно закрыть; Я ожидал, что это будет no-op. –

6

Я также столкнулся с этой проблемой при попытке написать простое приложение командной строки.

Другой альтернативой создать свой собственный объект BufferedReader из System.in является использование java.util.Scanner как это:

import java.util.Scanner; 

Scanner in; 
in = new Scanner(System.in); 

String s = in.nextLine(); 

Конечно, это не будет заменой к консоли, но будет дают вам доступ к различным функциям ввода.

Адрес more documentation on Scanner from Oracle.

5

Согласно API:

«Я е виртуальная машина запускается из интерактивной командной строки без перенаправления стандартных входных и выходных потоков, то его консоль будет существовать и, как правило, быть подключена к клавиатуре и отображение, с которого была запущена виртуальная машина. Если виртуальная машина запускается автоматически, например, с помощью планировщика фоновых заданий, то обычно у нее не будет консоли ».