2010-01-05 2 views
1

이것은 내 질문 here의 두 번째 부분입니다.프로세스에서 출력 얻기

이제 프로세스가 생겼으나 프로세스의 출력을 얻는 방법을 알고 싶습니다.

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

내 mediaProperty.java 다음 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; 
    } 
} 

. 안에 실제로는 문자열 배열입니다. 배열은 어떻게 가져 옵니까? 그리고 exec()를 올바르게 호출하는 방법이 맞습니까? 이 과정은 표준 출력에 직접 결과를 인쇄이하려는 경우

+0

이 아닌 public static void main (...)이 아닌 Object? – extraneon

+0

대개 클래스 이름이 중요하지 않지만 대개 자본으로 시작합니다. mediaProperty -> MediaProperty. – extraneon

+0

답장을 보내지 않으면 출력물을 어떻게 얻습니까? –

답변

1

당신은 System.setOut(new PrintStream(p.getOutputStream()))을 할 수 있습니다. 물론 이것은 이전 표준 출력보다 우선합니다. 하지만 프로세스의 출력 스트림에서 다른 스레드를 읽을 수도 있습니다.

코드의 문제점은 클래스의 주요 기능 유형 void이어야하고, 아무것도 돌려주지 않는 것입니다. 다른 JVM에서 실행 중일 때 프로세스간에 Java 객체를 전달할 수 없습니다. 이 작업을 수행해야한다면 객체를 디스크에 직렬화 할 수 있지만 별도의 프로세스로 실행하지 않아도된다고 생각합니다.

0

mediaPropmain() 방법의 로컬 변수입니다. 외부에서 액세스 할 수 없습니다.

mediaProperty 클래스를 약간 재 설계해야합니다.

0

먼저 사용해야합니다

"java -cp . mediaProperty " + filename 

을 Java 프로세스를 호출. "-cp ."은 classpath를 정의하며 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

는 잡았다의 몇 가지가 있습니다. 간부에서

당신은 자바 경로에 있다고 가정하고, 파일 이름은 정규화해야하거나 자바 프로세스의 현재 작업 디렉토리가 OK임을 알아야한다.

main()은 void (nothing)을 반환해야합니다.

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

을 입력 스트림 (호출 소프트웨어)에 다시 구문 분석 : 당신은 같은 프로그램 사용 무언가에서 결과를 전달합니다.

더 나은 방법은 Java 경로에 MediaProperty 클래스를 포함시키고 별도의 Java 프로세스를 호출하는 대신 main (...)을 직접 호출하는 것입니다.

2
  1. 사용 (반환 형식으로하지 Object) public static void main
  2. ObjectOutputStream를 사용하여 객체를 직렬화 (모든 필요한 예는 자바 독에서)
  3. 예는 다른 유일한 구성이다 - 처럼 구성 ObjectOutputStream oos = 새로운 ObjectOutputStream (System.out); exec()를 호출하는 프로그램
  4. , 이미 기반으로 ObjectInputStreamprocess.getOutputStream()
  5. 읽기와 출력을 얻을 이제 객체 (ObjectInputStream에의 Javadoc을 참조)

역 직렬화 OutputStream (check this)

  • 을 입수해온 , 이것은 이상한 방법이지만, 당신이 성취하고자하는 것을 정확히 알지 못하기 때문에 합리적이라고 생각합니다.

  • +0

    @Bozho : "Java OutputStream을 InputStream으로 변환"링크의 class1 및 class2는 무엇입니까? –

    +0

    class1은 프로세스 인스턴스입니다. Class2 필요 없어 - 당신은 ByteArrayInputStream 밖으로 ObjectInputStream을 만들 것입니다 – Bozho

    +0

    미안 해요, 모르겠어. ObjectInputStream의 "out"을 process.getOutputStream에 연결해야한다는 것을 알고 있습니다. "putDataOnOutputStream"과 같은 메소드가 없습니다. –

    관련 문제