Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从另一个java类编译java文件_Java - Fatal编程技术网

从另一个java类编译java文件

从另一个java类编译java文件,java,Java,我正在尝试从另一个Java类(ExecuteShellComand.Java)编译一个Java文件(str.Java)。我试图做的是,如果“str.java”编译成功,那么我想执行“javastr”命令,但是如果编译失败,那么应该打印正确的stacktrace或错误。我正在将stacktrace或错误存储在输出变量中 但是,当我执行这段代码时,尽管“str.java”中有一些错误,但System.out.println(output)并没有打印错误。Process类试图模拟操作系统进程。这意味着

我正在尝试从另一个Java类(ExecuteShellComand.Java)编译一个Java文件(str.Java)。我试图做的是,如果“str.java”编译成功,那么我想执行“javastr”命令,但是如果编译失败,那么应该打印正确的stacktrace或错误。我正在将stacktrace或错误存储在
输出
变量中


但是,当我执行这段代码时,尽管“str.java”中有一些错误,但System.out.println(output)并没有打印错误。

Process类试图模拟操作系统进程。这意味着,进程为错误和正常消息保留不同的输出流,为输入保留一个流。在UNIX中,应为:

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class ExecuteShellComand {

    public static void main(String[] args) {

        ExecuteShellComand obj = new ExecuteShellComand();
        String className = "str.java";
        String command = "javac " + className;
        String output = obj.executeCommand(command);
        System.out.println(output);// prints the output of the executed command
    }

    private String executeCommand(String command) {
        StringBuffer output = new StringBuffer();
        Process p;
        try {
            p = Runtime.getRuntime().exec(command);
            p.waitFor();
            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line = "";
            while ((line = reader.readLine()) != null) {
                output.append(line + "\n");
            }

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

        return output.toString();

    }

}

如果要从命令捕获错误,则应捕获错误流而不是输入流

因此,替换

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

public class ExecuteShellComand {

    public static void main(String[] args) {
        ExecuteShellComand obj = new ExecuteShellComand();
        String className = "str.java";
        String command = "javac " + className;
        obj.executeCommand(command);
        System.out.println(obj.output);
        System.out.println(obj.errors);
    }

    private String errors;
    private String output;

    private void executeCommand(String command) {
        Process p;
        try {
            p = Runtime.getRuntime().exec(command);
            p.waitFor();
            errors = readStream(p.getErrorStream());
            output = readStream(p.getInputStream());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private String readStream(InputStream inputStream) throws IOException {
        StringBuffer output = new StringBuffer();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String line = "";
        while ((line = reader.readLine()) != null) {
            output.append(line + "\n");
        }
        return output.toString();
    }

}


如果我必须捕获这两个流呢?然后你可以捕获InputsReal和errorstream作为不同的BufferedReader并从中获取数据。顺便说一下,由于Java 6,Java提供了一种在运行时编译类的标准方法。请在此处查看这篇文章:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ExecuteShellComand {

    public static void main(String[] args) {
        ExecuteShellComand obj = new ExecuteShellComand();
        String className = "str.java";
        String command = "javac " + className;
        obj.executeCommand(command);
        System.out.println(obj.output);
        System.out.println(obj.errors);
    }

    private String errors;
    private String output;

    private void executeCommand(String command) {
        Process p;
        try {
            p = Runtime.getRuntime().exec(command);
            p.waitFor();
            errors = readStream(p.getErrorStream());
            output = readStream(p.getInputStream());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private String readStream(InputStream inputStream) throws IOException {
        StringBuffer output = new StringBuffer();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String line = "";
        while ((line = reader.readLine()) != null) {
            output.append(line + "\n");
        }
        return output.toString();
    }

}
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getErrorStream()));