java: como ler e gravar no processo através do pipe (stdin / stdout)
(eu sou novo no java) Preciso iniciar um processo e receber 2 ou 3 identificadores: para STDIN, STDOUT e (e STDERR), para que eu possa gravar a entrada no processo e receber sua saída, da mesma forma que os tubos de linha de comando se comportar (por exemplo, "grep")
em Python, isso é obtido com o seguinte código:
from subprocess import Popen, PIPE
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE)
(child_stdin, child_stdout) = (p.stdin, p.stdout)
child_stdin.write('Yoram Opposum\n')
child_stdin.flush()
child_stdout.readlines()
Qual é o equivalente em Java ??
Eu tentei até agora
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader inp = new BufferedReader( new InputStreamReader(p.getInputStream()) );
BufferedWriter out = new BufferedWriter( new OutputStreamWriter(p.getOutputStream()) );
out.write( "Some Text!\n\n" );
out.flush();
line = inp.readLine();
print("response1: " + line ); // that's ok
out.write( "Second Line...\n" );
out.flush();
line = inp.readLine();
print("response2: " + line ); // returns an empty string, if it returns,,,
inp.close();
out.close();
BTW, a primeira tentativa funciona apenas com \ n \ n, mas não funciona com uma única \ n (por quê?)
o código a seguir funciona, mas todas as entradas são fornecidas antecipadamente, não o comportamento que estou procurando:
out.write( "Aaaaa\nBbbbbb\nCcccc\n" );
out.flush();
line = inp.readLine();
print("response1: " + line );
line = inp.readLine();
print("response2: " + line );
line = inp.readLine();
print("response3: " + line );
line = inp.readLine();
print("response4: " + line );
resultado:
response1: AAAAA
response2:
response3: bbbbbb
response4:
o processo que está sendo executado é assim:
s = sys.stdin.readline()
print s.upper()
s = sys.stdin.readline()
print s.lower()