2

我在网上找到了有关 JavaCompiler 的代码

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int result = compiler.run(null, null, null,
             "src/org/kodejava/example/tools/Hello.java");

它说compiler.run(null, null, null这三个空值分别是默认System.inSystem.outSystem.err。但是这些值实际上是做什么的,因为我找不到这些值的 API?有人可以解释一下吗?

4

3 回答 3

6

Javadoc 在这里

int run(InputStream in, OutputStream out, OutputStream err, String... arguments)

使用给定的 I/O 通道和参数运行该工具。按照惯例,工具返回 0 表示成功,返回非零表示错误。生成的任何诊断都将以某种未指定的格式写入 out 或 err。

Parameters:
    in - "standard" input; use System.in if null
    out - "standard" output; use System.out if null
    err - "standard" error; use System.err if null
    arguments - arguments to pass to the tool 
Returns:
    0 for success; nonzero otherwise

至于 System.in、System.out 和 System.err,它们是(默认情况下)连接到 STDIN、STDERR 和 STDOUT 的全局流。这三个是在 JVM 启动时由操作系统设置的。您可以将它们通过管道传输到文件,或者它们只是写入(读取)控制台。

在这种情况下,您将使用参数来检查程序的编译器输出(而不仅仅是将其发送给用户)。这就是“以某种未指定格式写出的诊断”的用武之地。

于 2012-07-24T08:24:26.800 回答
1

您可以指定自己的流,而不是依赖标准系统流。例如,如果您想将输出重定向到某个文件,您可以创建文件输出流,并传递给#run 调用。

于 2012-07-24T08:26:18.397 回答
1

JavaCompiler 是javax.tools.JavaCompiler并且它实现了javax.tools.Tool接口,参见javax.tools.Tool#run方法的 javadoc。

于 2012-07-24T08:31:53.190 回答