2017-01-24 2 views
3

저는 ProcessBuilder를 사용하여 명령을 실행하고 있습니다. 명령 출력은 jSON 형식이며 String을 반환하고 내 모델과 매핑하려고합니다.ProcessBuilder는 JSon String을 반환 할 수 없습니다.

문제는 프로세스에서 스트림을 읽으려고 할 때 아무런 결과가 없기 때문입니다. 내가 사용하는 명령에도 비 jSON 출력이 있습니다. 이 명령을 사용하여 ..

public String getPlate(String image) throws IOException, InterruptedException{ 
     ProcessBuilder pb = new ProcessBuilder("alpr", "-c eu", "-j on", "-n 1", image); 
     Process p = pb.start(); 
     p.waitFor(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     StringBuilder builder = new StringBuilder(); 
     String line; 
     while ((line = reader.readLine()) != null) { 
       builder.append(line); 
       builder.append(System.getProperty("line.separator")); 
      } 
      String result = builder.toString(); 
      return result; 
    } 

내가이 명령 버전을 사용하는 경우, 나는 결과를 얻을, 그래서 난 JSON을 읽을 수 때만 문제가 발생 내가 아닌 JSON 버전을 사용하는 경우, 어떤 결과가 주어지지

ProcessBuilder pb = new ProcessBuilder("alpr", "-c eu", "-n 1", image); 

나는 결과를 가지고 .. 출력이 읽을되지 않기 때문에

답변

4

프로세스가 거의 확실하게 차단하고 있습니다. 완성 될 때까지 출력을 읽지 않고, 출력이 읽 t 질 때까지 완료 할 수 없습니다. 하위 프로세스가 상위 프로세스와 하위 프로세스 사이의 파이프 v 퍼를 채우기에 충분한 출력을 생성하기 때.입니다. 자식이 실행되는 동안 아무 것도 파이프를 읽지 않으므로 쓰기를 차단합니다.

JSON이 아닌 출력은 프로세스 출력 스트림의 파이프 버퍼를 채우지 않아 프로세스가 완료 될 수 있도록 허용하므로 상위 Java 프로세스가 파이프 버퍼의 데이터를 읽을 수 있습니다.

당신은 당신이하고있는 일의 순서를 변경해야

public String getPlate(String image) throws IOException, InterruptedException{ 
     ProcessBuilder pb = 
      new ProcessBuilder("alpr", "-c eu", "-j on", "-n 1", image); 
     Process p = pb.start(); 

     BufferedReader reader = 
      new BufferedReader(new InputStreamReader(p.getInputStream())); 
     StringBuilder builder = new StringBuilder(); 
     String line; 
     while ((line = reader.readLine()) != null) { 
       builder.append(line); 
       builder.append(System.getProperty("line.separator")); 
     } 

     // wait for the child process *after* 
     // reading all its output 
     p.waitFor(); 

     String result = builder.toString(); 
     return result; 
} 

빠른 수정 - 그것은 실제로 매우 강력한 아니다. 자식 프로세스가 중요한 오류 출력을 생성하면 차단할 수도 있습니다.

이러한 차단을 방지하기 위해 필요에 따라 redirectError(), redirectInput(), and redirectOutput() 방법을 사용할 수 있습니다.

관련 문제