2

我发现这个代码在网上关于JavaCompiler进行Java编译器的run()方法

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

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

回答

6

Javadoc是here

INT运行(在InputStream中,01​​的OutputStream出来, 的OutputStream犯错, 串...参数)

运行与给定的I/O通道和参数的工具。按照惯例,一个工具返回0表示成功,非0表示错误。生成的任何 诊断信息都将写入未指定格式的某个 中。

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这些都是全球流是(默认)连接到标准输入,STDERR和STDOUT。这三个是在JVM启动时由操作系统设置的。您可以将它们传输到文件,或者只写入(读取)控制台。

在这种情况下,您可以使用这些参数来检查程序的编译器输出(而不是仅仅发送给用户)。这是“以某种非特定格式写出的诊断”的地方。

1

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

1

通过JavaCompiler是javax.tools.JavaCompiler它实现javax.tools.Tool接口,看的javadoc为javax.tools.Tool#运行方法。