Я написал код для выполнения команды на оболочке через 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.
Когда я использовал вашу командную строку из {"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 и установка каталога контекста выполнения...