2015-03-25 44 views
0

我有一個命令在命令提示符下直接運行時成功執行,但當使用runtime.getruntime.exec(「command 「);它不會提供所需的輸出。爲什麼它不能正常運行?當使用runtime.getruntime命令運行java代碼時,命令執行不成功執行

我正在執行的命令是更改管理密碼和我想重定向到文件的命令輸出。命令如下:

進程p = Runtime.getRuntime()。exec(「net user administrator 1234> yjs.txt 2> & 1」);

如果我直接運行「淨用戶管理員1234> yjs.txt 2> & 1」在我的命令提示它正確執行即在創建文本文件yjs.txt和ouptut被重定向到文件..

但是當我通過java代碼執行相同的命令時,文件yjs.txt根本就沒有創建。它編譯時甚至不會給出錯誤消息。任何想法爲什麼?

+0

您是否檢查了所有權限?雖然,那麼你至少應該得到錯誤信息。也許該文件已創建,但在預期的另一個目錄中。 – 2015-03-25 08:28:54

回答

0

您的命令提示符不僅僅是運行可執行文件,這是Runtime.exec()所做的。例如,輸出重定向(> yjs.txt 2>&1)是命令提示符的一個功能,但不是Java的一項功能。

如果你想將輸出重定向到一個文件,你有兩個選擇:

  • 把完整的命令,包括輸出重定向到一個批處理文件(或shell腳本,根據您的操作系統)並從Java執行該批處理文件。
  • 使用exec()返回的Process對象,並將自己從該對象接收到的輸出和錯誤流寫入文件。

其實,你應該做第二種情況。如果您啓動的命令生成大量輸出,則可能會在您的代碼沒有使用該輸出時開始阻止。看看http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html,它詳細解釋了Runtime.exec()的可能缺陷,並提供瞭解決方法(例如,在文章的列表4.5中使用StreamGobbler)。

+0

@Balaji Katika和大提琴非常感謝..我用大提琴的方法來使用過程對象..和它的工作:) – yjs 2015-03-27 06:15:53

0

這是因爲Runtime.getRuntime.exec()命令創建的默認子進程沒有自己的終端或控制檯。其所有標準I/O(即stdin,stdout,stderr)都將被重定向到父進程,並且可以通過getInputStream/getOutputStream/getErrorStream訪問它們。 您可以嘗試通過p.getOutputStream讀取命令「net user administrator 1234」的輸出,並使用文件I/O將其明確寫入yjs.txt文件。

此外,ProcessBuilder是執行命令的首選方式,除非您被古老的JVM所困住。請參閱http://docs.oracle.com/javase/7/docs/api/java/lang/Process.html的示例和文檔