Ваш код делает вещи очень сложным способом.Чтобы запустить команду в определенном рабочем каталоге и отправить вывод на консоль, используйте ProcessBuilder
и inheritIO()
.
Весь код ввопрос может быть уменьшен до:
public static void main(String[] args) throws IOException {
new ProcessBuilder("cmd", "/c",
"lscm", "login",
"-r", "https://xxxx.xxxx.xxxx.xxxx:9443/ccm",
"-n", "xxxx.xxxx.xxx.xxxx",
"-u", "itsme",
"-P", "gr^34dbtfgt7y")
.directory(new File("C:/Local Apps/xxx/xxx/xxxx/eclipse"))
.inheritIO()
.start()
.waitFor();
}
ОБНОВЛЕНИЕ
Чтобы собрать все выходные данные команды в одну строку, вы должны сначала объединить stdout и stderr, вызвавredirectErrorStream(true)
вместо вызова inheritIO()
, затем соберите вывод в String
, используя соответствующий набор символов.
Далее используется платформа по умолчанию Charset
, поскольку это, скорее всего, выводит команда.
String[] command = {
"cmd", "/c",
"lscm", "login",
"-r", "https://xxxx.xxxx.xxxx.xxxx:9443/ccm",
"-n", "xxxx.xxxx.xxx.xxxx",
"-u", "itsme",
"-P", "gr^34dbtfgt7y" };
Process p = new ProcessBuilder(command)
.directory(new File("C:/Local Apps/xxx/xxx/xxxx/eclipse"))
.redirectErrorStream(true) // stderr > stdout
.start();
p.getOutputStream().close(); // stdin < NUL
String output;
try (InputStream in = p.getInputStream()) {
output = new String(in.readAllBytes());
}
int errorCode = p.waitFor();
System.out.print(output);
if (errorCode != 0)
System.out.println("Program terminated with error code " + errorCode);
Приведенный выше код предназначен для Java 9+.Для Java 7+ получите output
вот так:
try (InputStream in = p.getInputStream()) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream(1024);
byte[] buf = new byte[1024];
for (int len; (len = in.read(buf)) > 0; )
bytes.write(buf, 0, len);
output = bytes.toString();
}