我正在编写一个程序,该程序通过使用class和Method类来调用主方法来执行另一个Java程序。然后,另一个程序尝试从System.in中读取。为了向程序传递参数,我将System.in设置为连接到PipedOutputStream的PipedInputStream。我将其他程序请求的参数传递给PipedOutputStream,然后调用main方法
但是,一旦调用该方法,程序就会死锁。为什么?理论上,其他程序应该可以访问这些参数,因为它们已经在PipedInputStream中可用
我无法更改其他程序读取输入的方式,因此此解决方案不起作用。
下面是一些示例代码:
我分配PipedStreams 的部分
PipedInputStream inputStream = new PipedInputStream();
PipedStringOutputStream stringStream = new PipedStringOutputStream(); // custom class
try {
stringStream.connect(inputStream);
} catch (IOException e2) {
e2.printStackTrace();
}
System.setIn(inputStream);
我调用方法的部分:
Class main = classes.get(className);
try {
Method m = main.getMethod("main", String[].class);
// write all parameters to System.in
String[] params = getParams(); // custom method, works (params is not empty)
for(int j = 0; j < params.length; j++) {
stringStream.write(params[j]);
}
params = null;
m.invoke(null, (Object) params); // this is were the program stops
} catch(Exception e) {}
PipedStringOutputStream类:
public class PipedStringOutputStream extends PipedOutputStream {
public void write(String output) throws IOException {
this.write((output + "n").getBytes());
flush();
}
}
我的测试程序从System.in:读取
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
System.out.println(sc.nextLine());
}
}
那么问题出在哪里呢?我必须启动线程中的流吗?为什么其他程序不从PipedInputStream读取输入?
PipedInputStream的javadoc明确表示:
通常,一个线程从PipedInputStream对象读取数据,另一个线程将数据写入相应的PipedOutputStream不建议尝试从单个线程使用这两个对象,因为这可能会使线程死锁。
(重点矿井)
使用ByteArrayOutputStream
将输入写入字节数组。然后根据该字节数组构造一个ByteArrayInputStream
,并将System.in
设置为该ByteArrayInputStream
。