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#運行方法。