표준 입력에서 한 줄씩 읽는 방법은 무엇입니까?


91

표준 입력에서 한 줄씩 읽는 Scala 레시피는 무엇입니까? 동등한 자바 코드와 같은 것 :

import java.util.Scanner; 

public class ScannerTest {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            System.out.println(sc.nextLine());
        }
    }
}

답변:


130

가장 직선 기대 방법은 사용 readLine()의 일부입니다 Predef. 그러나 최종 null 값을 확인해야하므로 다소 추악합니다.

object ScannerTest {
  def main(args: Array[String]) {
    var ok = true
    while (ok) {
      val ln = readLine()
      ok = ln != null
      if (ok) println(ln)
    }
  }
}

이것은 너무 장황하므로 대신 사용 java.util.Scanner하는 것이 좋습니다.

더 예쁜 접근 방식이 다음을 사용할 것이라고 생각합니다 scala.io.Source.

object ScannerTest {
  def main(args: Array[String]) {
    for (ln <- io.Source.stdin.getLines) println(ln)
  }
}

3
PREDEF의 방법 작성한 Readline은 2.11.0 이후 사용되지 않습니다, 지금은의 방법을 사용하는 것이 좋습니다scala.io.StdIn
nicolastrres

1
내가 사용하는 경우, "io.Source.stdin.getLines는"...이 처리 어떻게 ... 모드를 기다리는 것, 내 프로그램이 종료되지 @itemState
라자

53

콘솔의 경우 Console.readLine. 다음과 같이 쓸 수 있습니다 (빈 줄에서 중지하려는 경우).

Iterator.continually(Console.readLine).takeWhile(_.nonEmpty).foreach(line => println("read " + line))

입력을 생성하기 위해 파일을 분류하는 경우 다음을 사용하여 null 또는 비어있는 상태에서 중지해야 할 수 있습니다.

@inline def defined(line: String) = {
  line != null && line.nonEmpty
}
Iterator.continually(Console.readLine).takeWhile(defined(_)).foreach(line => println("read " + line))

Console.readLine ()에 대해 알고 있으며 주어진 레시피를 찾고 있습니다. 표준 입력에서 한 줄씩 읽는 "스칼라"방식.
Andrei Ciobanu 2011 년

11
제 생각에는takeWhile(_ != null)
Seth Tisue 2011-01-04

1
중지하려는 방법에 따라 다릅니다. 빈 줄을 찾는 것이 가장 간단한 해결책 인 경우가 많습니다.
Landei 2011 년

4
Scala 2.11.0부터는 Console.readLine더 이상 사용되지 않으므로 StdIn.readline대신 사용하십시오.
Bartłomiej Szałach 2011

또는 키워드를 완전히 .takeWhile(Option(_).nonEmpty)피하려는 경우 기분이 나아질 수 있습니다 null.
conny

27
val input = Source.fromInputStream(System.in);
val lines = input.getLines.collect

6
io.Source.stdin( scala.io.Source클래스에서) 정의 되어 def stdin = fromInputStream(System.in)있으므로 아마도 io.Source.stdin.
Nader Ghanbari

이것은 Scala 2.12.4에서 작동하지 않는 것 같거나 가져올 올바른 것을 찾지 못했습니다.
akauppi

그것은 단지 스칼라 2.12에서 작동 collect방금 전화 그래서 방법이 응답 sicne 변경 input.getLines하면을 준다 Iterator. 사용 사례에 따라 사용 .toStream하거나 사용하여 강제로 구체화 할 수 있습니다 .toList.
Nader Ghanbari

11

재귀 버전 (컴파일러가 힙 사용 개선을 위해 꼬리 재귀를 감지 함)

def read: Unit = {
  val s = scala.io.StdIn.readLine()
  println(s)
  if (s.isEmpty) () else read 
}

io.StdInScala 2.11 의 사용에 유의하십시오 . 또한이 접근 방식을 사용하면 최종적으로 반환되는 컬렉션에 사용자 입력을 축적 할 수 있으며 인쇄 할 수도 있습니다. 즉,

import annotation.tailrec

def read: Seq[String]= {

  @tailrec
  def reread(xs: Seq[String]): Seq[String] = {
    val s = StdIn.readLine()
    println(s)
    if (s.isEmpty()) xs else reread(s +: xs) 
  }

  reread(Seq[String]())
}

10

사용할 수 없습니다

var userinput = readInt // for integers
var userinput = readLine 
...

여기에서 사용 가능 : Scaladoc API


이 루프 제시된 코드와 일치하지 않는
techkuz

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.