Есть ли какой-нибудь встроенный класс Scala для захвата вывода внешнего процесса? - PullRequest
7 голосов
/ 28 января 2010

Поскольку в Scala так много классных вещей, я подумал, что в них может быть что-то, что облегчает захват результатов процесса. Я знаю способ Java сделать это, но я подумал о том, чтобы попросить другой способ.

Ответы [ 3 ]

5 голосов
/ 29 января 2010
scala> scala.tools.nsc.io.Process("ls -1 /tmp | wc").stdout foreach println
      41      63     770

Или есть команда repl:

scala> :sh cat /etc/passwd | wc
stdout: List[String] = List(      65     185    3667)

Для доставки любого кода ввода-вывода с 2.8 потребовалось бы преодоление большего количества энергии остановки, чем я могу превзойти, поэтому я поместил все это в компилятор. В scala.tools.nsc.io множество полезных вещей.

5 голосов
/ 28 мая 2011

Начиная с Scala 2.9, вы можете сделать:

import scala.sys.process.Process
println(Process("uname -a").!!.contains("x86_64"))
3 голосов
/ 28 января 2010

Не совсем правильно даже говорить, что это делает Java, поскольку из-за различий в обработке процессов / потоков в разных операционных системах большая часть этой функциональности фактически передается нативному коду.

Более интересным вопросом будет спросить, есть ли у Scala какой-либо способ более «идиоматически» работать с читателями и писателями (или каналами, если вы объединяете свои потоки с функциональностью NIO)

А ответ?

В настоящее время ведется работа над библиотекой scala IO, основанной на версии 2.8, она почти наверняка будет включать лучший способ работы с потоками и каналами, но пока недоступна.

Вы также можете найти, что акторы - лучший способ справиться с обычной практикой использования одного потока для ввода и одного потока для вывода при работе с процессом exec ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...