从java运行终端程序并将其保存到名为output1.txt的文件中

时间:2014-09-11 13:50:25

标签: java

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileOutputStream;
import java.io.InputStream;

public class RunInput {
    public static void main(String[] args) {
        try {
            Process p = Runtime.getRuntime().exec("java Island < island1.in");
            p.waitFor();

            InputStream in = p.getInputStream();



            int b;
            while ((b = in.read()) != -1) {
                outputStream.write(b);
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我无法弄清楚为什么我的程序似乎没有运行命令行并将其保存到output1.txt。有人能告诉我这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:0)

我认为有两件事缺失:

  1. 您需要为Java命令设置类路径
  2. 您需要填写要执行的命令行的参数
  3. 例如,假设类路径是当前目录:

    String[] commands = { "java", "-cp", ".", "Island", "< island1.in" };
    Process p = Runtime.getRuntime().exec(commands);
    

答案 1 :(得分:0)

Runtime.exec不会在shell中执行给定的命令,因此通过<>的重定向将无法正常工作。相反,它们将作为附加参数传递给执行的命令。请改用Process返回的exec对象的getOutputStreamgetInputStream方法。

不要被名称混淆:getOutputStream返回子进程的标准输入流(类型为java.io.OutputStream),而getInputStream返回子进程的标准输出流(类型为java.io.InputStream)。我认为这些方法更好地命名为getStandardInputgetStandardOutputgetStandardError

答案 2 :(得分:0)

您可以在不使用以下代码调用单独的Java VM的情况下执行此操作:

    System.setIn(new FileInputStream("island1.in"));
    System.setOut(new FileOutputStream("output1.txt"));
    new Island().main(new String[0]);

这会将“stdin”和“stdout”替换为您的文件,然后调用Island类的主要部分。