内部调用的Java程序未读取PipedInputStream

内部调用的Java程序未读取PipedInputStream,java,stream,Java,Stream,我正在编写一个程序,通过使用类和方法类调用主方法来执行另一个Java程序。然后,另一个程序尝试从System.in读取数据。为了向程序传递参数,我将System.In设置为连接到PipedOutStream的PipedInputStream。我将其他程序请求的参数传递给PipedOutputStream,然后调用main方法。 但是,一旦调用该方法,程序就会死锁。为什么呢?理论上,另一个程序应该可以访问参数,因为它们已经在PipedInputStream中可用。 我无法更改其他程序读取输入的方式

我正在编写一个程序,通过使用类和方法类调用主方法来执行另一个Java程序。然后,另一个程序尝试从System.in读取数据。为了向程序传递参数,我将System.In设置为连接到PipedOutStream的PipedInputStream。我将其他程序请求的参数传递给PipedOutputStream,然后调用main方法。
但是,一旦调用该方法,程序就会死锁。为什么呢?理论上,另一个程序应该可以访问参数,因为它们已经在PipedInputStream中可用。
我无法更改其他程序读取输入的方式,因此此解决方案不起作用

下面是一些示例代码:
我指定管道流的部分

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) {}
从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对象读取数据,另一个线程将数据写入相应的PipedOutStream不建议尝试从单个线程使用两个对象,因为这可能会使线程死锁

(强调矿山)


使用
ByteArrayOutputStream
将输入写入字节数组。然后从这个字节数组构造一个
ByteArrayInputStream
,并将
System.in
设置为这个
ByteArrayInputStream

(1)这里没有从任何东西读取的代码,更不用说管道了。(2) 既然已经将参数直接传递给main(),为什么要使用管道?(3) 这里的问题是什么?你的主要方法是什么?也显示其代码。@EJP:1)我添加了一些从系统读取的示例代码。在2)我没有直接将参数传递给main(),此时参数为null。另一个程序将从System.in读取,因此我必须以这种方式传递参数。3) 问题是如何将参数传递给System.in,以便其他程序可以读取它们。假设管道是正确的步骤,我想知道我的代码中有什么错误。谢谢!如果我将另一个程序的main方法作为普通方法调用调用,那么这很好,但是当我通过invoke()调用它时,它似乎无法从ByteArrayInputStream中读取,即使要读取的字节是正确的。扫描仪的hasNext()方法始终返回false。为什么会这样?直接调用使用反射的方法不会改变任何事情。使用hashNextLine()测试是否有下一行。不是hasNext()。现在它可以工作了。我对Java的值系统调用有点纠结,这就是为什么system.in没有设置为正确的流。
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    while(sc.hasNext()) {
        System.out.println(sc.nextLine());
    }
}