2010-08-24 4 views
5

Java 프로그램의 Linux 명령 행 도구를 사용하고 싶습니다. 나는 프로그램을 시작하고 Process 클래스 (http://download.oracle.com/javase/6/docs/api/java/lang/Process.html)를 사용하여 출력을 얻을 :Java의 명령 행 도구와의 통신

GNU 옥타브, 버전 3.0.5 저작권 (C) 2008 존 W : 나는 다음과 같은 출력을 얻을

/* @param args 
    * @throws IOException 
    */ 
public static void main(String[] args) throws IOException { 
    Process proc = Runtime.getRuntime().exec("octave"); 

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

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

    BufferedWriter writer = 
     new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())); 

    int c; 
    while((c = proc.getInputStream().read()) != -1) { 
     System.out.print((char)c); 
    } 
    System.out.println("End"); 
} 

을 Eaton과 다른 사람들. 이것은 무료 소프트웨어입니다. 복사 조건에 대한 코드 코드를 참조하십시오. 절대적으로 보증이 없음; 상품성 또는 적합성은 에 해당되지 않습니다. 자세한 내용을 보려면 `보증 '을 입력하십시오.

"i486-pc-linux-gnu"에 옥타브가 구성되었습니다.

옥타브에 대한 추가 정보는 http://www.octave.org에서 사용 가능한 입니다.

소프트웨어가 유용 할 경우 기여 해주십시오. 자세한 내용은 방문 http://www.octave.org/help-wanted.html

보고서에 버그를 들어 (그러나 첫째 , http://www.octave.org/bugs.html 에 읽기 도움이되는 보고서를 작성하는 방법에 대해 알아주세요).

이전 버전의 변경 사항에 대해서는 'news'를 입력하십시오.

이상한 것은 내가 터미널에서 옥타브를 실행하면 정상 출력되는 다음과 같다 :

: ~/작업/콘솔/SRC/C $ 옥타브
GNU 옥타브, 버전 3.0. 5 저작권 (C) 2008 John W. Eaton 및 기타. 이것은 무료 소프트웨어입니다. 조건을 복사하기위한 소스 코드를 참조하십시오. 절대적으로 보증이 없습니다. 상품성 또는 특정 목적에의 적합성조차도 아닙니다. 자세한 내용을 보려면`보증 '을 입력하십시오.

"i486-pc-linux-gnu"에 옥타브가 구성되었습니다.

옥타브에 대한 추가 정보는 http://www.octave.org입니다.

이 소프트웨어가 유용 할 경우 제공 해주시기 바랍니다. 자세한 내용은 (그러나 첫째, http://www.octave.org/bugs.html가 도움이 보고서를 작성하는 방법을 배울 읽어 보시기 바랍니다)에 http://www.octave.org/help-wanted.html

보고서 버그를 방문하십시오.

이전 버전의 변경 사항에 대해서는`news '를 입력하십시오.

옥타브>

1 그래서 입력 내 입력 스트림에 전송되지 않습니다 요청 라인의 문자. 왜?입력 요청 여부를 감지 할 수 있습니까?

답변 해 주셔서 감사합니다.

하인리히

답변

1

: 아래에서 리눅스를 결국하여 --interactive와 함께 옥타브를 사용 - no-line-editing optionand it worked :)

하인리히

7

* nix의 프로그램이 터미널이나 다른 스트림과 대화하고 있는지 여부를 감지 할 수 있습니다. 그리고 많은 대화 형 셸 유형의 프로그램이이를 기반으로 다르게 반응합니다 (다른 프롬프트를 설정하거나 일부 초기화 파일을 읽지 않거나 전혀 시작하지 않음).

이러한 상황 중 하나에 부딪 힐 수도 있습니다.

옥타브 용 Java API를 사용하는 것이 쉬운 방법 일 수도 있습니다 (예 : joPAS).

+0

joPAS에 대한 링크를 제공해 주셔서 감사합니다. API를 살펴 보겠습니다. 어쨌든, 왜 Java 프로그램에서 "옥타브 : 1>"문자를 얻지 못하는지 궁금합니다. – Erik

2

문제가 옥타브에 따라 다르므로 옥타브에 --silent 옵션을 사용하고 명령 줄에서 단일 히트로 모든 매개 변수를 전달하는 것이 좋습니다. 이것은 터미널 세션 시작에 대해 앞에서 강조 표시된 문제를 해결합니다.

+0

유감스럽게도 자바에서 옥타브를 대화식으로 사용하고자 할 때 이것이 불가능합니다. – Erik

1

이 프롬프트에 대한 새 파일 설명자를 열 수 있습니까?

옥타브 소스 코드 (또는 옥타브가 그것을 사용한다면 readline 소스 코드)에서 찾을 수 있습니다.

2

옥타브의 출력이 버퍼링되기 때문에 "octave : 1>"프롬프트가 표시되지 않습니다. Unix/Linux에서 stdio를 사용하는 많은 프로그램은 출력이 대화 형 장치가 아닌 경우 동일한 작업을 수행합니다. 버퍼가 채워지거나 (자동으로 플러시 될 때까지) 버퍼가 fflush (3)을 호출하는 프로그램에 의해 명시 적으로 플러시 될 때까지 출력을받지 못합니다.

커맨드 라인 프로그램과 상호 작용하고 싶다면 pty (필자가 한번도 시도한 적이 없기 때문에 내가 모르는 뭔가)를 사용해야한다. 무슨 일이 일어나고 있는지 설명 "남자의 stdio"에서

발췌 : 나는 마침내 문제를 해결할 수

At program startup, three text streams are predefined and need not be 
    opened explicitly -- standard input (for reading conventional input), 
    standard output (for writing conventional input), and standard error 
    (for writing diagnostic output). These streams are abbreviated 
    stdin,stdout and stderr. When opened, the standard error stream is not 
    fully buffered; the standard input and output streams are fully 
    buffered if and only if the streams do not to refer to an interactive 
    device. 

    Output streams that refer to terminal devices are always line buffered 
    by default; pending output to such streams is written automatically 
    whenever an input stream that refers to a terminal device is read. In 
    cases where a large amount of computation is done after printing part 
    of a line on an output terminal, it is necessary to fflush(3) the stan- 
    dard output before going off and computing so that the output will 
    appear.