gpt4 book ai didi

java:如何通过管道(stdin/stdout)读取和写入进程

转载 作者:搜寻专家 更新时间:2023-11-01 01:23:54 24 4
gpt4 key购买 nike

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

最佳答案

好的,这也是我的 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()

关于java:如何通过管道(stdin/stdout)读取和写入进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4112470/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com