Канал («|») и grep не работают в ProcessBuilder в Android

#java #android #processbuilder

#java #Android #processbuilder

Вопрос:

Я хочу получить общий объем оперативной памяти на 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 resu<
        } 
  

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

Ответ №1:

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

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

Ответ №2:

Как предполагает @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();
}