Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java:如何读写&;从工艺管道(标准输入/标准输出)_Java_Pipe_Stdin - Fatal编程技术网

java:如何读写&;从工艺管道(标准输入/标准输出)

java:如何读写&;从工艺管道(标准输入/标准输出),java,pipe,stdin,Java,Pipe,Stdin,(我是java新手) 我需要启动一个进程并接收2或3个句柄:对于STDIN、STDOUT(和STDERR),这样我就可以向进程写入输入并接收其输出,与命令行管道的行为方式相同(例如“grep”) 在Python中,这是通过以下代码实现的: from subprocess import Popen, PIPE p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE) (child_stdin, child_stdout) = (p.stdin, p.s

(我是java新手) 我需要启动一个进程并接收2或3个句柄:对于STDIN、STDOUT(和STDERR),这样我就可以向进程写入输入并接收其输出,与命令行管道的行为方式相同(例如“grep”)

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

我相信问题出在你打电话的过程中:

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

<>编辑:这不能解释示例输出中的空行…真的不知道发生了什么,但不幸的是,我现在不能研究它。

好的,这也是我python的代码错误,但与@Jon的回答相反,有一个额外的换行符(确切地说是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()

如果是这样的话,第二个代码块(报告为工作的)会工作吗?看起来它对行尾没有什么不同。@Sean:第二段代码最初发送三个换行符,因此该过程将在写入“aaaabbbbbb”后终止。此时,
readLine()
将看到输入流的结尾,并将数据统计到最后一行。请注意,这也解释了为什么
“\n\n”
在第一种情况下工作,但随后返回一个空的第二个字符串。如果没有打印换行符,这不会导致工作示例在一行上输出aabbb吗?@Sean:Hmm,是的,您是对的。不知道这是怎么发生的。不幸的是,我现在无法研究它。Python的“print”语句自动添加了一个换行符,大致相当于Java的println。如果您能为这两个过程提供一个简短但完整的示例,那将非常有用。基本上是一种复制行为的方法。啊,很高兴你已经解决了:)希望我们的错误答案在这一过程中仍然有用…@BerryTsakala,它很有效,但是如果返回的字符串跨越多行,那么似乎有问题。此外,如果有错误的输入,您还需要有errorStream。我正在尝试使用您的想法,但是不同的程序有一些问题,我想应该在这里使用线程,任何想法??在您的Java代码中没有发送
0xA0
,并且
0xA0
不是行终止符
0x0A
是换行符,如果这是您的意思的话。