java:如何读取和写入&从流程到管道(stdin / stdout)

时间:2010-11-06 08:33:39

标签: java pipe stdin

(我是java的新手) 我需要启动一个进程并接收2或3个句柄:对于STDIN,STDOUT,(和STDERR),所以我可以将输入写入进程并接收其输出,与命令行管道的行为相同(例如“grep”)< / p> 在Python中

使用以下代码实现:

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

什么是Java等价物?

到目前为止我已经尝试了

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

顺便说一句,第一次尝试仅适用于\ n \ n,但不适用于单\ n(为什么?)

以下代码有效,但所有输入都是事先给出的,而不是我正在寻找的行为:

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

输出:

response1: AAAAA
response2: 
response3: bbbbbb
response4: 

正在运行的流程如下:

s = sys.stdin.readline()
print s.upper()
s = sys.stdin.readline()
print s.lower()

2 个答案:

答案 0 :(得分:9)

好吧,这也是我的python的代码错误,但与@ Jon的答案相反,有一个EXTRA换行符(确切地说是0xA0,这不是Windows的标准)。

一旦我从Java中获取了额外的0xA0,python就会在回来的路上为Java添加一个“普通”\ n,并且运行顺利。

问题和答案的完整性,这是一个有效的Java代码:

import java.io.*;
import java.util.*;

public class Main {

    public static BufferedReader inp;
    public static BufferedWriter out;

    public static void print(String s) {
    System.out.println(s);
    }

    public static String pipe(String msg) {
    String ret;

    try {
        out.write( msg + "\n" );
        out.flush();
        ret = inp.readLine();
        return ret;
    }
    catch (Exception err) {

    }
    return "";
    }



    public static void main(String[] args) {

    String s;
    String cmd = "c:\\programs\\python\\python.exe d:\\a.py";

    try {

        print(cmd);
        print(System.getProperty("user.dir"));
        Process p = Runtime.getRuntime().exec(cmd);

        inp = new BufferedReader( new InputStreamReader(p.getInputStream()) );
        out = new BufferedWriter( new OutputStreamWriter(p.getOutputStream()) );

        print( pipe("AAAaaa") );
        print( pipe("RoteM") );

        pipe("quit")
        inp.close();
        out.close();
    }

    catch (Exception err) {
        err.printStackTrace();
    }
    }
}

这是python代码

import sys
s = sys.stdin.readline().strip()
while s not in ['break', 'quit']:
    sys.stdout.write(s.upper() + '\n')
    sys.stdout.flush()
    s = sys.stdin.readline().strip()

答案 1 :(得分:2)

我认为问题出在你正在调用的过程中:

s = sys.stdin.readline()
print s.upper()
s = sys.stdin.readline()
print s.lower()

我怀疑readline将会读取该行,但s包含行终止符。然后你打印那行,但没有行终止符 ...然后Java阻塞,直到它读取一个行终止符,它将永远阻塞,因为进程不是'给予一个。

这是一个小小的猜测,因为我不清楚你所调用的语言是什么语言 - 如果print实际上 输出行终止符,那么这是不正确的猜测。但是,如果没有,您可能需要将其更改为:

s = sys.stdin.readline()
println s.upper()
s = sys.stdin.readline()
println s.lower()

编辑:这并不能解释样本输出中的空行......不知道发生了什么,真的,但不幸的是我现在无法调查它。