runtime无法执行grep_如何使管道使用Runtime.exec()?
慕運維8079593
我在Linux中遇到了一個類似的問題,只不過是“ps-ef_grep找進程”。至少使用“ls”可以替換與語言無關(盡管速度較慢)的Java。例如:File?f?=?new?File("C:\\");String[]?files?=?f.listFiles(new?File("/home/tihamer"));for?(String?file?:?files)?{
????if?(file.matches(.*some.*))?{?System.out.println(file);?}}有了“ps”,這就有點難了,因為Java似乎沒有相應的API。我聽說西格也許能幫到我們:https:/Support.hyperic.com/Display/SIGAR/Home然而,最簡單的解決方案(正如Kaj所指出的)是以字符串數組的形式執行管道命令。以下是完整的代碼:try?{
????String?line;
????String[]?cmd?=?{?"/bin/sh",?"-c",?"ps?-ef?|?grep?export"?};
????Process?p?=?Runtime.getRuntime().exec(cmd);
????BufferedReader?in?=
????????????new?BufferedReader(new?InputStreamReader(p.getInputStream()));
????while?((line?=?in.readLine())?!=?null)?{
????????System.out.println(line);?
????}
????in.close();}?catch?(Exception?ex)?{
????ex.printStackTrace();}為什么字符串數組與管道一起工作,而單個字符串不能.這是宇宙之謎之一(尤其是如果你還沒有讀過源代碼)。我懷疑這是因為當給EXEC一個字符串時,它首先解析它(以我們不喜歡的方式)。相反,當向exec提供字符串數組時,它只是將其傳遞給操作系統,而不對其進行解析。實際上,如果我們從繁忙的一天抽出時間來查看源代碼(見http:/grepcode.com/file/pository.grepcode.com/java/root/JDK/OpenJDK/6-b14/java/lang/Runtime.java#Runtime.exec%28java.lang.String%2 Cjava.lang.String[]%2 Cjava.io.File%29),我們發現這正是正在發生的事情:public?Process??[More?...]?exec(String?command,?String[]?envp,?File?dir)?
??????????throws?IOException?{
????if?(command.length()?==?0)
????????throw?new?IllegalArgumentException("Empty?command");
????StringTokenizer?st?=?new?StringTokenizer(command);
????String[]?cmdarray?=?new?String[st.countTokens()];
????for?(int?i?=?0;?st.hasMoreTokens();?i++)
????????cmdarray[i]?=?st.nextToken();
????return?exec(cmdarray,?envp,?dir);}
總結
以上是生活随笔為你收集整理的runtime无法执行grep_如何使管道使用Runtime.exec()?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 注意力测试软件系统,儿童注意力训练评估软
- 下一篇: C语言指针怎么存二维数组,C语言怎么用指