2010-01-05 4 views
1

Это вторая часть моего вопроса here.Получить результат от процесса

У меня теперь есть процесс, но я хочу знать, как получить результат из процесса?

String filename = matlab.getfileName(); 
Process p = Runtime.getRuntime().exec("java -cp mediaProperty.java " + filename); 

Мои mediaProperty.java:

public class mediaProperty { 

    public static Object main(String[] args) { 
     Object[] mediaProp = null; 
     java.util.List lstMedia = new ArrayList(); 
     Media media = null; 

     try { 
      media = new Media(); 
      lstMedia.add(args); 
      mediaProp = media.media(3, lstMedia); 

     } catch (Exception p) { 
      System.out.println("Exception: " + p.toString()); 
     } finally { 
      MWArray.disposeArray(mediaProp); 
      if (media != null) { 
       media.dispose(); 
      } 
     } 
     return mediaProp; 
    } 
} 

mediaProperty.java возвращает объект. Внутри это фактически массив строк. Как получить массив? И способ, которым я называю exec() правильным?

+0

Разве это не public static void main (...) вместо Object? – extraneon

+0

Хотя на самом деле не имеет значения, имена классов обычно начинаются с капитала; mediaProperty -> MediaProperty. – extraneon

+0

Если я ничего не верну, как мне получить свой результат? –

ответ

1

Вы можете сделать System.setOut(new PrintStream(p.getOutputStream())), если вы хотите, чтобы процесс распечатывал результаты непосредственно на стандартный вывод. Конечно, это заменит старый стандартный вывод. Но вы также можете делать другие вещи с выходным потоком процесса, например, с потоком, который читается из него.

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

0

mediaProp - локальная переменная в вашем методе main(). Он не доступен снаружи.

Вам придется немного изменить свой класс mediaProperty.

0

Во-первых, вы должны использовать:

"java -cp . mediaProperty " + filename 

для вызова процесса Java. "-cp ." определяет путь к классам, и я сделал предположение, что java-файл скомпилирован, а сгенерированный файл класса находится на том же пути, что и процесс выполнения.

Затем вам нужно напечатать результат на стандартном выходе, а не просто вернуть его. Наконец, прочтите это article для чтения вывода.

  • Подсказка 1: Переименовать класс MediaProperty
  • Подсказка 2: Почему вы не вызываете класс MediaProperty непосредственно из вашего кода? Нужно ли начинать новый процесс?
+0

Да, мне нужен процесс, длинный рассказ здесь: http: //stackoverflow.com/questions/1997585/error-when-calling-compiled-m-file-jar-in-a-multi-threaded-java- app –

0

Есть несколько gotcha.

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

main() должен возвращать пустоту (ничего). Если вы хотите, чтобы передать результаты из вашей программы использования что-то вроде:

for (Object o : mediaProp) { 
    System.out.println(o); 
} 

и разобрать его снова на входном потоке (вызывающий программное обеспечение).

Еще лучше, включите класс MediaProperty в путь Java и вызовите main (...) непосредственно вместо вызова отдельного Java-процесса.

2
  1. использование public static void main (не Object в качестве возвращаемого типа)
  2. сериализовать объект с помощью ObjectOutputStream (все необходимые примеры в Javadoc)
  3. Единственное отличие от примера является строительство - построить его как ObjectOutputStream oos = новый ObjectOutputStream (System.out);
  4. в программе, вызывающей exec(), получить выход с process.getOutputStream()
  5. Читать в ObjectInputStream на основе уже retreived OutputStream (check this)
  6. Deserialize объект (см Javadoc из ObjectInputStream)

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

+0

@Bozho: Что такое class1 и class2 в вашей ссылке «Преобразовать Java OutputStream в InputStream»? –

+0

class1 - это экземпляр процесса. Class2 вам не нужно - вы создадите ObjectInputStream из ByteArrayInputStream – Bozho

+0

Простите, я не понимаю. Я знаю, что мне нужно связать «out» объекта ObjectInputStream с process.getOutputStream. Нет такого метода «putDataOnOutputStream»? –