Pipe ("|") и grep не работают в ProcessBuilder в Android - PullRequest
0 голосов
/ 26 апреля 2011

Я хочу получить общий объем оперативной памяти на Android:

       private String getTotalRAM() 
       {
         ProcessBuilder cmd;
         String result="";

         try{
          String[] args = {"/system/bin/sh", "-c", "cat -n /proc/meminfo | grep MemTotal"};
          cmd = new ProcessBuilder(args);

          Process process = cmd.start();
          InputStream in = process.getInputStream();
          byte[] re = new byte[1024];
          while(in.read(re) != -1){
            System.out.println(new String(re));
            result = result + new String(re);
          }
          in.close();
          } catch(IOException ex){
            ex.printStackTrace();
          }
         return result;
        } 

Если нет grep MemTotal, cat возвращает мне всю информацию о памяти.Когда я хочу получить только одну строку с grep, я ничего не получаю.Как я могу это исправить?Я просто хочу получить общий объем доступной оперативной памяти в данный момент.

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011

Все виды перенаправлений (|, >, <, ...) обрабатываются оболочкой. Если вы не вызываете оболочку, вы не сможете их использовать.

Чистым решением было бы прочитать /proc/meminfo в вашем коде Java и выполнить простой поиск строки MemTotal вручную. Код не будет намного длиннее того, что вы делаете сейчас, и потребует гораздо меньше ресурсов.

2 голосов
/ 26 апреля 2011

Как @Joachim предполагает, что вы, вероятно, найдете это для вас.

BufferedReader pmi = new BufferedReader(new FileReader("/proc/meminfo"));
try {
  String line;
  while ((line = pmi.readLine()) != null)
    if (line.contains("MemTotal"))
       // get the second word as a long.
       return Long.parseLong(line.split(" +",3)[1]); 
  return -1;
} finally {
  pmi.close();
}
...