2015-06-12 5 views
2

Я пытаюсь запустить Handbrake через приложение Java, которое я пишу, и мне трудно дождаться завершения Handbrake.BufferedReader, кажется, бесконечно читает первую строку

Когда я пытаюсь это:

 ProcessBuilder builder = new ProcessBuilder(
       "cmd.exe", "/c", command); 
     Process p = builder.start(); 

     BufferedReader inputreader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line = null; 
     while((line = inputreader.readLine()) != null) 
     { 
      System.out.println(line); 
     } 

Выход я получаю:

Encoding: task 1 of 1, 0.00 % 

Снова и снова, и файл никогда не конвертируется.

Когда я изменить его на следующее:

 BufferedReader inputreader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     BufferedReader errorreader = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
     String line = null; 
     String line2 = null; 
     while((line = inputreader.readLine()) != null && (line2 = errorreader.readLine()) != null) 
     { 
      System.out.println(line); 
      System.out.println(line2); 
     } 

Он работает на моих тестовых файлов, однако он получает похмелья вверх, когда errorreader исчерпывает строк читать и ReadLine() блокирует поток бесконечно , В файлах полной длины файл преобразуется, но эта часть кода блокируется, поэтому она никогда не продолжается с приложением.

Любые предложения?

+0

У меня общее ощущение, что процесс, для которого вы ждёте, не дает возможности выполнить, и, следовательно, вы повесили трубку на том же выходе, что и у него. –

+1

Что такое выход? – fftk4323

+0

@TimBiegeleisen - Это была моя оригинальная мысль, но когда вторая работала, я был смущен тем, что могло бы случиться. –

ответ

3

Перед созданием процесса вызовите builder.redirectErrorStream(true); (это объединит входной сигнал и поток ошибок в один: поток ввода) и будет считываться только с InputStream.

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

Если вы хотите, чтобы они были разделены, вы можете запустить два потока, чтобы читать из потока ввода и один из потока ошибок.

+0

Да, это, казалось, решало обе проблемы. Любая идея, почему это может заставить первыми работать? –

+0

Не определенно, но: эти потоки - это трубы с ограниченной пропускной способностью. Если вы не читаете из потока ошибок (в первом примере), он заканчивается, и это означает, что процесс не может продолжаться. My * guess *: ручной тормоз, вероятно, многопоточный, а поток, который выполняет преобразование, записывает в поток ошибок. Этот поток блокируется, потому что поток потока ошибок заполнен. Другой поток отправляет данные во входной поток (выходной поток stdout с точки зрения ручного тормоза), и он продолжает отправлять «0%», потому что поток преобразования заблокирован. –

+0

Это интересная мысль, которую я должен попытаться проскочить немного глубже и посмотреть, могу ли я подтвердить что-то подобное, что вызвало проблему. Спасибо за ваш вклад! –