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