2013-04-17 3 views
0

I 일부 데이터를 출력 C++ 프로그램 (feeder.exe) : 원함 초당 20-30 선 아니라 균일 생산지연없이 Java InputStream을 읽는 방법은 무엇입니까?

printf("%s\n", line); 

평균한다. 내가 출력으로 볼 때, 나는 그것이 3-5에 한 번 문자열의 대부분을받는 것을 볼

package temp_read;  
import java.io.*; 
public class Main { 

    public static void main(String[] args) throws Throwable { 
     Process p = Runtime.getRuntime().exec("d:/feeder.exe"); 
     InputStream is = p.getInputStream(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(is)); 
     String line = null; 
     while ((line = in.readLine()) != null) { 
      System.out.println(System.currentTimeMillis() + "," + line); 
     } 
    } 
} 

:

나는 자바 코드에서 EXE 파일을 실행하여 Java 프로그램에서이 데이터를 잡으려면 초.

질문 : stdout으로 인쇄 할 때 아무런 지체없이 즉시 feeder.exe에서 데이터를받는 방법?

추 신 : 관련 질문 : Ctrl + C로 Java를 중지하면 feeder.exe를 중지하는 방법은 무엇입니까?

+0

'feeder.exe | 더 많은 '당신은 동일한 행동을 볼 가능성이 있습니다. 나는 버퍼에있는 것이 Java에서 어떻게 읽히는가가 아닌 파이프에 있다고 생각합니다. –

+0

동일한 질문에서 관련없는 질문을하지 마십시오. 다른 질문으로 물어보십시오. –

+0

@PeterLawrey, Windows에서 실행합니다. – Serg

답변

2

리디렉션되는 경우 stdout이 버퍼링되어 문제가 Java 측이 아니라 C++ 코드에 있음을 의미합니다. C++ 프로세스는 버퍼가 가득 차게되면 즉시 출력을 버퍼링하고 여러 "printf"를 한 번에 플러시합니다.

C++ 소프트웨어를 수정할 수 있으면 printf 다음에 fflush(stdout);을 실행하여 출력 버퍼를 강제로 플러시하십시오.

+0

좋아요. 'fflush (stdout);'이 C++ 코드에서 수정되었습니다. 감사! – Serg

1

가장 큰 원인은 feeder.exe이 출력 스트림을 정기적으로 비우지 않아서 버퍼가 채워져 결과로 기록 될 때까지 데이터가 출력 버퍼에 앉아 있다는 것입니다.

이것이 원인 인 경우이를 피하기 위해 Java 측에서 수행 할 수있는 작업이 없습니다. 문제는 feeder 응용 프로그램을 수정해야 해결할 수 있습니다.


데이터가 두 프로세스를 연결하는 "파이프"에있는 경우 Java 측에서 읽으면 얻을 수 있습니다. 라인의 끝이 파이프에 기록되었다고 가정하면 readLine() 호출은 블로킹없이 라인을 전달합니다.

관련 문제