内部调用的Java程序没有读取PipedInputStream



我正在编写一个程序,该程序通过使用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

相关内容

  • 没有找到相关文章

最新更新