Не удается получить вывод из Runtime.exec ()

1

Я написал код для выполнения команды на оболочке через Java:

 String filename="/home/abhijeet/sample.txt";

        Process contigcount_p;

        String command_to_count="grep  \">\" "+filename+" | wc -l";

        System.out.println("command for counting contigs "+command_to_count); 

        contigcount_p=Runtime.getRuntime().exec(command_to_count);


         contigcount_p.wait();

Поскольку символы трубы использовались, поэтому я не смог выполнить команду успешно. В соответствии с моим последним обсуждением вопроса я завернул мои переменные в оболочке:

Runtime.getRuntime().exec(new String[]{"sh", "-c", "grep \">\" "+filename+" | wc -l"});

Это сработало для меня, поскольку оно выполняет команду на оболочке, но все же, когда я пытаюсь прочитать ее вывод с помощью буферизованного считывателя:

   BufferedReader reader = 
                    new BufferedReader(new InputStreamReader(contigcount_p.getInputStream())); 

   String line=" ";
   while((line=reader.readLine())!=null)
   {
       output.append(line+"\n");
   }

Он возвращает нулевое значение, я нашел временное решение для него, как я уже обсуждал на предыдущем вопросе: link, но я хотел бы использовать правильный способ сделать это, прочитав его вывод с использованием BufferedReader.

  • 2
    Попробуйте вместо этого использовать ProcessBuilder
  • 0
    Можете ли вы объяснить, почему я не получаю свой вывод таким образом? Команда успешно выполняется на терминале. Но bufferedReader возвращает нулевое значение.
Теги:

1 ответ

0
Лучший ответ

Когда я использовал вашу командную строку из {"sh", "-c", "grep \">\" "+filename+" | wc -l"} он продолжал переопределять мой файл

Мне пришлось изменить его так, чтобы кавычки были двойными: {"sh", "-c", "grep \"\">\"\" "+filename+" | wc -l"}

Итак, используя это как содержимое моего тестового файла...

>
>
>

Not a new line >

И используя этот код...

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class TestProcess {

    public static void main(String[] args) {
        String filename = "test.tx";
        String test = "grep \"\">\"\" "+filename+" | wc -l";
        System.out.println(test);

        try {
            ProcessBuilder pb = new ProcessBuilder("sh", "-c", test);
            pb.redirectError();
            Process p = pb.start();
            new Thread(new Consumer(p.getInputStream())).start();

            int ec = p.waitFor();
            System.out.println("ec: " + ec);
        } catch (IOException | InterruptedException exp) {
            exp.printStackTrace();
        }
    }

    public static class Consumer implements Runnable {

        private InputStream is;

        public Consumer(InputStream is) {
            this.is = is;
        }

        @Override
        public void run() {
            try (BufferedReader reader =  new BufferedReader(new InputStreamReader(is))){
                String value = null;
                while ((value = reader.readLine()) != null) {
                    System.out.println(value);
                }
            } catch (IOException exp) {
                exp.printStackTrace();
            }
        }

    }

}

Я смог произвести этот выход...

grep "">"" test.tx | wc -l
4
ec: 0

Как правило, при работе с внешними процессами обычно проще использовать ProcessBuilder, у него есть несколько хороших параметров, в том числе перенаправление ошибки /stdout и установка каталога контекста выполнения...

  • 0
    ProcessBuilder работал для меня :), но я хотел бы знать, что это проблема с Runtime.exec ()?
  • 0
    Я подозреваю, что это могло быть способом, которым я должен был дважды избегать кавычек, но это также могло быть способом, которым вы читали выходной поток (или не читали поток ошибок)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню