Запустите еще одну банку и введите в нее данные - PullRequest
4 голосов
/ 17 июня 2020

Мне нужно запустить jar и ввести в него данные. Я нашел, как запустить jar, который работает без проблем, используя Runtime # getRuntime # exe c, и я также обнаружил, что

String command = "stop";
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
bufferedWriter.write(String.format("%s\n", command));
bufferedWriter.flush();

должен работать. Но проблема в том, что у меня это просто не работает, буквально ничего не делает. Кто-нибудь знает как это сделать? Процесс:

    public static Process startJar(File jarFile, String flags, String args, @Nullable File dir) throws IOException {
        if (dir == null){

            return Runtime.getRuntime().exec(String.format("cmd /c start /wait \"\" java -jar %s \"%s\" %s",flags ,jarFile.getAbsolutePath(), args));

        }
        return Runtime.getRuntime().exec(String.format("cmd /c start /wait \"\" java -jar %s \"%s\" %s", flags, jarFile.getAbsolutePath(), args), null, dir);


    }

Ответы [ 3 ]

2 голосов
/ 17 июня 2020

Если ввод - это аргументы командной строки, передайте его exec напрямую.

Если нет, и предполагая, что process - это другой запущенный вами jar-файл, вам нужно будет записать его в InputStream process, а не OutputStream. process.getOutputStream() даст вам поток, в который process выводит свои результаты, а не то, откуда он читает свои входные данные.

EDIT: после того, как Таши указал, что код правильный

Нашел еще один вопрос похожий на ваш. В принятом ответе указано, что вам нужно либо закрыть writer, либо передать \n, чтобы он работал. Попробуй это. Если он по-прежнему не работает, убедитесь, что другой JAR, который вы используете, действительно ожидает ввода в свой STDIN.

1 голос
/ 17 июня 2020

Я предполагаю, что ваш процесс заблокирован, потому что он пытался что-то записать на свой вывод, а вы его не читали. В API do c указано:

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

Итак, прочтите из process.getInputStream () и process.getErrorStream (), если оба они не пусты, и тогда он должен нормально обработать ваш ввод.

См. Здесь: Запуск процесса в Java? для возможного примера того, как читать.

0 голосов
/ 18 июня 2020

Проблема заключалась в том, что я запускал эту банку в новом окне (cmd / c start), после его удаления все работает без проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...