2014-01-09 2 views
0

Я звоню в java-программу. внутренняя банка возвращает некоторый выход. как читать и отображать в следующей программе? Я могу позвонить банке успешно, но как отобразить вывод?Вызов и возврат выходных данных jar в другую программу java

import java.io.InputStream; 
public class call_xml_jar { 
public static void main(String argv[]) { 

     try{ 

    // Run a java app in a separate system process 
    Process proc = Runtime.getRuntime().exec("java -jar xml_validator.jar"); 

    // Then retreive the process output 
    InputStream in = proc.getInputStream(); 
    InputStream err = proc.getErrorStream(); 
    System.out.println("Completed..."); 

     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
} 
} 

Выход: Завершена ... Я хочу, чтобы напечатать выход банку, а

+2

Вы пробовали читать из потоков? – Reimeus

+1

Вы можете преобразовать объект входного потока в строку. http://stackoverflow.com/questions/309424/read-convert-an-inputstream-to-a-string –

+0

@Reimeus: я просто sysout переменную, но не повезло .. – logan

ответ

0

Я решил это сам .. Вот мое решение ...

// Then retreive the process output 
InputStream in = proc.getInputStream(); 
InputStream err = proc.getErrorStream(); 
System.out.println("Completed..."); 

InputStreamReader is = new InputStreamReader(in); 
StringBuilder sb=new StringBuilder(); 
BufferedReader br = new BufferedReader(is); 
String read = br.readLine(); 
while(read != null) { 
     //System.out.println(read); 
     sb.append(read); 
     sb.append("\n"); 
     read =br.readLine(); 
    } 
System.out.println(sb); 
1

С линии

InputStream in = proc.getInputStream(); 
InputStream err = proc.getErrorStream(); 

Вы уже в пути.

Эти потоки предоставляют вам доступ к стандартным выводам и стандартным потокам ошибок другого приложения (соответственно). Кстати: вы извлекаете стандартный выходной поток другого приложения, вызывая getInputStream(), так как это представление вашего текущего приложения; вы находитесь , вводя данные другого приложения.

Просто чтобы уточнить: стандартный выход и стандартный поток ошибок доступны в приложении путем печати вызовов на System.out и System.err (соответственно).

Итак, если у вас есть - например, System.out.println("Hello world") в другом приложении, вы получите соответствующие байты (см. Ниже) во входном потоке, который вы ссылаетесь на переменную in приведенного выше фрагмента кода.

Как правило, вас не интересуют байты, но вы хотите получить строку, которую вы поместили в вывод. Поэтому вы должны преобразовать байты в строку. Для этого вы обычно должны предоставить кодировку (класс Java для этого - Charset). Фактически, в таких случаях работает стандартная кодировка платформы.

Самый простой способ, чтобы обернуть входной поток в буферном читателя: используется

BufferedReader outReader = new BufferedReader(new InputStreamReader(proc.getInputStream())); 

кодирования Вышеуказанная mntioned платформы по умолчанию, если не указать любой набор символов в конструкторе InputStreamReader «s.

BufferedReader знает метод readLine(), который вы должны использовать для получения всего вывода другого приложения.

while(outReader.ready()) 
    System.out.println(outReader.readLine()) 

Одно слово о промывке: Если вы записываете данные в стандартный выходной поток, этот поток очищается только, когда символ новой строки также записывается. Это делается по звонкам до System.out.println(...). И именно по этой причине вы должны читать целые строки от читателя.

Теперь вы можете собрать код, который считывает вывод другого приложения? Если нет, возможно, вам стоит задать еще один вопрос.

+0

+1 Спасибо за ваше время. Пожалуйста, см. Мой ответ также .. так же – logan

+0

Хорошие результаты. :-) – Seelenvirtuose

Смежные вопросы