如何使用java在cmd中运行的程序中输入

时间:2015-12-23 01:21:22

标签: java cmd

我正在创建一个程序,它将接受源代码,编译它,并输入测试用例以查看程序是否正确。如果可能的话,源代码检查器。我用于编译程序的是通过cmd。我现在的问题是,一旦程序在cmd中运行,如何输入测试用例。 这实际上是我们学校的一个项目。所以教授会给出一个问题(例如输入一个整数,如果它是偶数或奇数),那么该程序将通过测试教授提供的测试用例来检查学生的源代码(例如输入:1输出:奇数,输入2:输出:偶数)。

这是我的示例代码(c#编译器)

case ".cs":
            CsCompiler();
            Run(path + "\\program");
            break;

我的职能:

public static void CsCompiler() throws IOException, InterruptedException {
        Process(path + "\\", " c:\\Windows\\Microsoft.NET\\Framework\\v3.5\\csc /out:program.exe *.cs");
    }

public static void Process(String command, String exe) throws IOException, InterruptedException {
        final Process p;
        if (command != null) {
            p = Runtime.getRuntime().exec(exe, null, new File(command));
        } else {
            p = Runtime.getRuntime().exec(exe);
        }

        new Thread(new Runnable() {
            public void run() {
                BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
                String line = null;

                try {
                    while ((line = input.readLine()) != null) {
                        System.out.println(line);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        p.waitFor();
    }

public static void Run(String command) throws IOException, InterruptedException {
            String[] argss = {"cmd", "/c", "start", command};

            ProcessBuilder pb;

            pb = new ProcessBuilder(argss);
            pb.start();
        }

1 个答案:

答案 0 :(得分:1)

如果我找对了你想要启动一个程序并在从java方法注入输入时获取其输出。实际上这非常简单,因为你已经在编译方法中进行了输出提取 Process类还有getOutputStream方法,您可以使用该方法为流程注入输入 我将通过一个例子说明如何做到这一点 将这个简单的C程序视为学生源代码,将数字作为输入并检查它是偶数还是奇数。

#include <stdio.h>
int main(){
    int x;
    printf("Enter an Integer Number:\n");
    if (( scanf("%d", &x)) == 0){
        printf("Error: not an Integer\n");
        return 1;
    }
    if(x % 2 == 0) printf("even\n");
    else printf("odd\n");
    return 0;
}

现在实现这样的Run方法来运行应用程序,注入输入,读取输出并检查返回值。

public static void Run(String command, String input) throws IOException, InterruptedException {
    // create process
    String[] argss = {"cmd", "/c", command};
    ProcessBuilder pb = new ProcessBuilder(argss);
    Process process = pb.start();        
    // create write reader
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));        
    // write input
    writer.write(input + "\n");
    writer.flush();
    // read output
    String line = "";
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
    // wait for process to finish
    int returnValue = process.waitFor();
    // close writer reader
    reader.close();
    writer.close();
    System.out.println("Exit with value " + returnValue);
}

就是这样。如果你像这样调用这个方法

Run("NumberChecker.exe", "1");
Run("NumberChecker.exe", "2");
Run("NumberChecker.exe", "a");

您将获得以下输出

Enter an Integer Number:
odd
Exit with value 0
Enter an Integer Number:
even
Exit with value 0
Enter an Integer Number:
Error: not an Integer
Exit with value 1