java getRuntime exec不会捕获另一个java程序的输入,给出未知的源错误

时间:2014-05-27 22:40:17

标签: java input runtime exec call

我遇到一些关于getRuntime exec命令的问题。我用这个命令来调用另一个像这样的java程序

import java.util.*;

public class main {

    public static void main(String[] args) throws Exception {
        double x = -1;
        Scanner klavye = new Scanner(System.in);
        while (x < 0) {
            System.out.println("assign negative number");
            x = klavye.nextDouble();
            System.out.println(x);
        }
        System.out.println("x is positive, the program finished!");

    }
}

我使用cmd和javac命令将此程序保存为main.class。然后,我使用第二种方法在另一个java类中调用该程序;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

/**
 *
 * @author kozmos
 */
public class runWithJava implements Runnable {

    public runWithJava(InputStream istrm, OutputStream ostrm) {
        istrm_ = istrm;
        ostrm_ = ostrm;
    }

    public void run() {
        try {
            final byte[] buffer = new byte[1024];
            for (int length = 0; (length = istrm_.read(buffer)) != -1;) {
                ostrm_.write(buffer, 0, length);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private final OutputStream ostrm_;
    private final InputStream istrm_;

    public static void main(String[] args) throws IOException, InterruptedException {
        String[] command = {"cmd",};
        Process p = Runtime.getRuntime().exec(command);

        new Thread(new runWithJava(p.getErrorStream(), System.err)).start();
        new Thread(new runWithJava(p.getInputStream(), System.out)).start();

        PrintWriter stdin = new PrintWriter(p.getOutputStream());
        stdin.println("java main > mainOutput.txt");

        // write any other commands you want here
        stdin.close();
        //int returnCode = p.waitFor();
        //System.out.println("Return code = " + returnCode);*/
    }

}

但是如果我想像主要类那样接受输入,那么就会出现错误

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextDouble(Unknown Source)

但是,所有其他java程序都运行良好,不需要输入扫描程序或缓冲输入。有没有根据另一个java程序输入使用getRuntime exec获取输入的解决方案?

1 个答案:

答案 0 :(得分:0)

我认为异常的原因是子程序所期望的输入与您实际发送的输入之间存在不匹配/

您在此处发送输入信息:

stdin.println("java main > mainOutput.txt");

您可以在这里阅读:

Scanner klavye = new Scanner(System.in);
System.out.println("assign negative number");
x = klavye.nextDouble();
System.out.println(x);

这会尝试将"java"视为double

你应该这样做:

stdin.println("1234.56");

stdin.println("-42.0");
stdin.println("1234.56");

除此之外,您不应创建多个Scanner对象来阅读子程序中的System.in。在循环之前只创建一个并重用它。


顺便说一句&#34; Unknown Source&#34;不是错误。它只是说JVM无法提供源文件名和行号信息,因为您使用的是没有调试信息的JRE。

真正的错误是java.util.NoSuchElementException并且它正在发生,因为它无法像double那样读取下一个令牌...就像您的代码要求它一样。