사용자가 콘솔에 stdin 이외의 값으로 입력을 제공하려는 경우 사용자의 질문에서 알 수 없습니다. 스칼라 프로그램에서이 기능을 "완전히 포함"하고 싶다고 생각하지만, 아직 그 기능을 수행하지 못했습니다. 그러나 콘솔을 사용할 수있는 경우 사용자 이름/비밀번호를 요청하는 간단한 스칼라 프로그램 예제와 스칼라 프로그램을 시작하는 또 다른 스칼라 프로그램의 예가 있으며 Process.run(true)
은 호출 된 프로그램의 out/err을 입력 할 수있는 동안 콘솔에 연결합니다 콘솔에 제공됩니다. 복용 입력 테스트 할
SimpleProgram :의 Process
이 경우
package so
import scala.sys.process._
object ProcessBuilderTest extends App {
val classpath = "<path to>/scala-library.jar:./classes"
val pb = Process("java", Seq("-cp", classpath, "so.SimpleProgram"))
pb.run(true) // all the magic happens here.
}
:
package so
import java.util.Scanner
object SimpleProgram extends App {
def getInput(prompt: String): Option[String] = {
print(s"$prompt: ")
val sc = new Scanner(System.in)
sc.hasNextLine match {
case true => val out = sc.nextLine
if(out.length > 1) Some(out) else None
case _ => None
}
}
while(true) {
(getInput("username"), getInput("password")) match {
case (Some(u), Some(p)) => println(s"Logged in as $u"); System.exit(0)
case _ => println("Invalid input. Please try again.")
}
}
}
그리고 여기가 (클래스 경로 변경하여 w/o 작동하지 않습니다) ProcessBuilder를 호출 프로그램의 기본적으로 호출 된 프로그램을 ProcessBuilder
에 래핑하는 것입니다. 나는 ProcessIO
을 사용하여 적절한 문자를 먹을 수있는 방법을 제공하지 못하고 여전히 스트림 등을 죽일 수 없었다. 내 생각에 작동하는 run(true)
사례를 보면 유익 할 것입니다.
username: foo
password:
Invalid input. Please try again.
username: foo
password: bar
Logged in as foo
내가이 없기 때문에 스칼라 코드를 실행하는 "자바"를 사용하고 스칼라 내 맥에 설치 : 여기
는 수정 클래스 경로와 후자를 실행 한 콘솔 로깅의 예 Eclipse를 통하지 않고. Eclipse에서
ProcessBuilderTest
은 두 클래스가있는 프로젝트 디렉토리에서 실행되었고 출력 디렉토리는 "bin"대신 "classes"로 설정되었습니다.
수행하려는 작업에 대해 자세히 설명해 주시겠습니까? –
나는 당신이 필요로하는 것이 여기 있다고 생각합니다 : http://stackoverflow.com/questions/7195051/scala-getting-a-callback-when-an-external-process-exits –
이 질문에 대한 답변을 업데이트하십시오. 많은 감사. – elm