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()

questionAnswers(2)

yourAnswerToTheQuestion