Я столкнулся с подобной проблемой в Linux, за исключением того, что это была "ps -ef | grep someprocess".
По крайней мере, с "ls" у вас есть независимая от языка (хотя и более медленная) замена Java. Eg.:
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
Однако самое простое решение (как указал Кадж) - выполнить конвейерную команду в виде строкового массива. Вот полный код:
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();
}
Относительно того, почему массив String работает с pipe, а одна строка - нет ... это одна из загадок вселенной (особенно если вы не читали исходный код). Я подозреваю, что это потому, что когда exec передается одна строка, он сначала анализирует ее (так, как нам не нравится). Напротив, когда exec передается строковый массив, он просто передает его операционной системе, не анализируя его.
На самом деле, если мы берем время из напряженного дня и смотрим на исходный код
(в http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Runtime.java#Runtime.exec%28java.lang.String%2Cjava.lang.String[]%2Cjava.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);
}