Я использовал readLine
из BufferedReader
, чтобы получить ввод/новый пароль от пользователя, но хотел скрыть пароль, поэтому я пытаюсь использовать класс java.io.Console
. Проблема в том, что System.console()
возвращает null
, когда приложение отлаживается в Eclipse. Я новичок в Java и Eclipse не уверен, что это лучший способ достичь? Я нажимаю правой кнопкой мыши на исходный файл и выбираю «Debug As»> «Java Application». Есть ли обходной путь?System.console() возвращает null
ответ
Это правильно.
Вам нужно будет запустить приложение вне Eclipse. Посмотрите на панели конфигурации пусковой установки в Eclipse и посмотрите, можете ли вы определить параметр, который говорит, чтобы запустить команду в отдельной JVM.
Я считаю, что в конфигурациях запуска для Eclipse вы можете настроить, следует ли назначать консоль или нет - убедитесь, что это отмечено. (Прошло некоторое время с тех пор, как я использовал Eclipse, поэтому я не могу дать конкретные инструкции, которых я боюсь).
Если это не сработает, то то, что определенно сделает это задание, запустит ваше приложение в режиме отладки, а затем подключится к процессу с помощью Eclipse. Найдите «удаленную отладку eclipse», если вы не знаете, как это сделать.
Кроме того, в общем, это плохая идея: требует пульта, который будет назначен, поскольку это очень сильно влияет на гибкость вашего приложения - как вы только что обнаружили. Многие способы вызова Java не будут назначать консоль, и ваше приложение не будет использоваться в этих случаях (что плохо). Возможно, вы могли бы альтернативно разрешить аргументы в командной строке. (Если вы тестируете вход в консоль конкретно, то достаточно справедливы, но потенциально может быть полезно, чтобы люди могли вызывать ваше приложение из сценариев и/или на безгласных серверах, поэтому такой гибкий дизайн почти всегда является хорошей идеей . это часто приводит к более организованному коду, тоже)
Да, это только для моей цели отладки, пользователи получат сценарий оболочки или файл bat. Разве это не gud использовать консоль? если да, то что является лучшим способом – Gauls
BTW все удаленные отладочные поисковые запросы abt web server, но я не создаю веб-приложение. это простая Java. может быть лучший способ маскировки пароля? – Gauls
Вы можете удаленно отлаживать любой процесс Java, просто добавьте, например. '-Xdebug -Xrunjdwp: transport = dt_socket, server = y, suspend = n, address = 8000' для аргументов VM (по крайней мере, для Sun JVM). Использование консоли может быть в порядке, но, как указано, означает, что ваш код просто * не будет работать * при запуске без него. Вместо этого рассмотрите возможность передачи значений, непосредственно полученных из аргументов командной строки, свойств системы, файлов свойств и т. Д. По крайней мере, предоставляйте некоторую альтернативу - например, переходите только к консоли, если значение * не было * предоставлено в качестве аргумента командной строки. –
Согласно docs:.
Если виртуальная машина запускается автоматически, например, с помощью фона планировщика заданий, то он, как правило, не имеет консоль.
Этот ответ заставил меня найти, что если вы используете Gradle с включенным deamon, вы не сможете получить консоль в своих задачах Gradle. Выполнение моей задачи Gradle с помощью «-no-daemon» позволяет использовать консоль. – whitespy9
Это случилось со мной при использовании капельницы (https://github.com/ninjudd/drip) для инструмента командной строки. К сожалению! –
System.console()
возвращение null если нет консоли.
Вы можете обойти это либо adding a layer of indirection to your code, либо путем запуска кода на внешней консоли и attaching a remote debugger.
Он также возвратил null для меня в PowerShell при запуске чего-то вроде 'java -cp ... Class | tee вне'. –
добавить -console в ваших аргументов программы для запуска OSGi консоли
, пожалуйста, проясните подробнее об этом, если это возможно, пример? – Gauls
Это bug #122429 затмения
Этот фрагмент кода должен сделать трюк:
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, , ваш пароль будет отображаться в ясном виде. По крайней мере, вы сможете протестировать. Просто не вводите свой реальный пароль во время тестирования. Держите это для использования в производстве;).
Если ваш ручной метод 'readLine' закрывает' BufferedReader' в блоке finally (или try-with-resources)? –
Нет, потому что это закроет совпадение потока 'System.in', после чего последующее чтение не будет выполнено. – formixian
Да, странно, что этот поток можно закрыть; Я ожидал, что это будет no-op. –
Я также столкнулся с этой проблемой при попытке написать простое приложение командной строки.
Другой альтернативой создать свой собственный объект BufferedReader из System.in является использование java.util.Scanner как это:
import java.util.Scanner;
Scanner in;
in = new Scanner(System.in);
String s = in.nextLine();
Конечно, это не будет заменой к консоли, но будет дают вам доступ к различным функциям ввода.
Согласно API:
«Я е виртуальная машина запускается из интерактивной командной строки без перенаправления стандартных входных и выходных потоков, то его консоль будет существовать и, как правило, быть подключена к клавиатуре и отображение, с которого была запущена виртуальная машина. Если виртуальная машина запускается автоматически, например, с помощью планировщика фоновых заданий, то обычно у нее не будет консоли ».
Также см. Http://stackoverflow.com/questions/26470972/trying-to-read-from-console-java/26473083#26473083. Я определил 'System.out' и' System.in' достаточным для мой вариант использования и не используется с помощью 'System.console()'. – OneWorld