Использование java.lang.ProcessBuilder - PullRequest
0 голосов
/ 18 марта 2011

Из Java-приложения я запускаю bat-файл, который запускает другое Java-приложение:

  ProcessBuilder processBuilder = new ProcessBuilder("path to bat file");
  Process process = processBuilder.start();

Но процесс никогда не запускается, и никаких ошибок не выводится. Но если я добавлю строку:

  String resultString = convertStreamToString(process.getInputStream());

после: Процесс process = processBuilder.start ();

где:

  public String convertStreamToString(InputStream is) throws IOException {
    /*
     * To convert the InputStream to String we use the Reader.read(char[]
     * buffer) method. We iterate until the Reader return -1 which means there's
     * no more data to read. We use the StringWriter class to produce the
     * string.
     */
    if (is != null) {
      Writer writer = new StringWriter();
      char[] buffer = new char[1024];
      try {
        Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
        int n;
        while ((n = reader.read(buffer)) != -1) {
          writer.write(buffer, 0, n);
        }
      } finally {
        is.close();
      }
      return writer.toString();
    } else {
      return "";
    }   }

работает нормально! Есть идеи?

Ответы [ 2 ]

0 голосов
/ 23 марта 2011

Решено здесь:

Запуск процесса с унаследованным stdin / stdout / stderr в Java 6

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

В связанной статье демонстрируется один метод чтения из потоков.Однако основная идея заключается в том, что вы должны постоянно читать вывод / ошибку из подпроцесса, чтобы предотвратить зависание из-за блокировки ввода / вывода.

0 голосов
/ 18 марта 2011

Если это действительно командный файл, вам следует запустить интерпретатор командной строки как процесс (например, cmd.exe) с этим файлом в качестве параметра.

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