2015-01-19 1 views
1

Process.start를 사용하여 Process를 만들고 있는데 stdin getter로 조금 붙어 있습니다. 이상적으로, StreamController를 다른 곳에서 설정했는데, Stream의 스트림을 stdin으로 전달하고 싶습니다. 하지만 Process.stdin과 상호 작용할 수있는 정교한 예제가 너무 많지 않으므로 표준 입력란보다 더 많은 작업을 수행하는 방법을 모르겠습니다.다트 IO 프로세스가 기존 스트림을 표준으로 사용하도록 어떻게 설정합니까?

그래서 난에 문자열 메시지를 추가 할 수 있습니다, 이런 식으로 뭔가있어 :

StreamController<String> processInput = new StreamController<String>.broadcast(); 

그리고 나는 이런 일을하고 싶지 :

Process.start(executable, args, workingDirectory: dir.path, runInShell: true).then((Process process) { 
process.stdout 
    .transform(UTF8.decoder) 
    .listen((data) { 
    s.add('[[CONSOLE_OUTPUT]]' + data); 
    }); 
process.stdin.addStream(input.stream); 
}); 

내가 addStream()을 실현 Stream<List<int>>을 원하지만 이유가 확실하지 않습니다. 이 문자열에 대한 write 방법을 가지고 있도록

답변

2

stdin 개체가 IOSink입니다 작동 할 수 있습니다. 문자열을 인코딩하는 UTF-8로 기본 설정됩니다. 그래서, 대신

process.stdin.addStream(input.stream) 

당신은 어쩌면,

IOSink stdin = process.stdin; 
input.stream.listen(stdin.write, onDone: stdin.close); 

당신은 아마도 쓰기 사이의 표준 입력을 세척, 일부 오류 처리를 할 수 있습니다 수행 할 수 있습니다

input.stream.listen(
    (String data) { 
     stdin.write(data); 
     stdin.flush(); 
    }, 
    onError: myErrorHandler, 
    onDone: stdin.close); 

은 또한 당신은 할 수 있습니다 수동으로 UTF-8 인코딩을 사용하여 이 기대하는 정수 목록의 스트림을 가져옵니다.

process.stdin.addStream(input.stream.transform(UTF8.encoder)) 

List<int> 일 것으로 예상하는 이유는 프로세스 통신이 핵심으로 바이트 만입니다. 텍스트를 보내는 것은 발신자와 수신자가 인코딩에 대해 사전 동의해야하므로 바이트를 동일한 방식으로 해석 할 수 있습니다.

+0

인코딩 방법에 대한 송수신 이해가 적합합니다. 감사! – Crunchex

1

이,

process.stdin.addStream(UTF8.encoder.bind(input.stream)); 
관련 문제