2010-08-28 51 views
1

IM試圖做到這一點在Android之後的過程:爪哇 - (機器人)重用沖洗器的OutputStream

Process p = Runtime.getRuntime().exec("sh"); 

    DataOutputStream out = new DataOutputStream(p.getOutputStream()); 

    out.writeBytes("something useful\n"); 

    out.close(); 

    p.waitFor(); 

    out = new DataOutputStream(p.getOutputStream()); 

    out.writeBytes("something useful\n"); 

    out.close(); 

    p.waitFor(); 

我執行out.writeBytes第二次(); ,我得到一個java IOException:「壞文件號」。 我的應用程序必須執行幾個本機程序,但始終使用相同的過程。 任何人都知道爲什麼這不起作用?

回答

1

注意,外殼不屬公共SDK的一部分(注意它的SDK文檔隨時隨地未記錄)所以這段代碼實際上依賴於私有API。

此外,這使您在正常的應用程序模型之外 - 我們無法保證您所分叉的進程將會發生什麼,並且不會被平臺管理。它可能隨時被殺死。

與執行命令在您自己的過程中執行的任何操作相比,這也是一種非常低效的做事方式。並且爲一個命令啓動一個單獨的進程不會讓它做任何事情,因爲它仍然以你的uid運行。

所以基本上...對於99.99%的應用程序請不要這樣做。如果您正在編寫終端應用程序...好吧,好吧,無論如何,只有極客纔會關心這個應用程序,它不會很有用,因爲它作爲您的uid運行,但沒關係。但否則,請不要。 :)

+1

是的,我必須承認,我正在寫一個終端應用程序。 :D 我現在有一個工作workaroud: 我用exec(「sh」)啓動shell進程; 然後我得到outputstream並通過writeBytes(command)添加命令; 我添加每個命令後(「回聲完成」); 所以我等待,直到我收到回聲,並知道命令執行。 :x – Fr4gg0r 2010-08-28 23:54:48

0

當您撥打out.close()時,它會自動在您的流程的輸出流上呼叫close()

每次撥打電話p.getOutputStream()即可獲得相同的OutputStream,在您第二次使用時,p.getOutputStream()返回已關閉的OutputStream

基本上用你的代碼,你並不需要關閉第一個DataOutputStream

來源:

+0

Mh, 但我必須等到命令執行完畢。 =/ 沒有關閉(); process.waitFor()將永遠阻塞。 – Fr4gg0r 2010-08-28 14:27:01

+0

只要做'out.flush();' – 2010-08-28 14:36:07

+0

只有flush();如果我打電話給process.waitFor() – Fr4gg0r 2010-08-28 14:38:40