如何在Scala中获取用户输入?

87

我想从用户那里获取输入。您能告诉我如何在Scala中请求用户输入字符串吗?


6
val input = readLine("prompt> ") - huynhjl
请查看Scaladoc上的Console - Daniel C. Sobral
直接使用readLine()已被弃用。请改为导入StdIn中的readLine: import scala.io.StdIn.readLine; - New Coder
10个回答

130

在Scala 2.11中使用

scala.io.StdIn.readLine()

使用已弃用的 Console.readLine 的替代方案。


26

这是读取整数值的标准方法

val a = scala.io.StdIn.readInt()
println("The value of a is " + a)

同样地

def readBoolean(): Boolean

从标准输入(stdin)读取整行数据并解析为布尔值。

def readByte(): Byte
从标准输入中读取一整行,并返回其中一个字节值。
def readChar(): Char

从标准输入中读取一整行的字符值。

def readDouble(): Double

从标准输入流中读取一整行的Double值。

def readFloat(): Float
从标准输入中读取一整行的浮点数值。
def readInt(): Int

从标准输入中读取一整行的Int类型值。

def readLine(text: String, args: Any*): String

将格式化的文本打印到标准输出并从标准输入读取一整行。

def readLine(): String

从标准输入中读取一整行。

def readLong(): Long

从标准输入(stdin)读取一整行的Long类型值。

def readShort(): Short
从标准输入中读取一整行的 Short 类型的值。
def readf(format: String): List[Any]

根据格式说明符从标准输入(stdin)读取结构化的输入。

def readf1(format: String): Any

根据给定的格式说明符从标准输入中读取结构化输入,仅返回第一个提取的值,符合格式规范。

def readf2(format: String): (Any, Any)

根据格式说明符从标准输入流中读取结构化输入,根据格式规范仅返回提取的前两个值。

def readf3(format: String): (Any, Any, Any)

根据格式说明从stdin中读取结构化输入,仅返回提取的前三个值,符合格式规定。

如果您想从同一行读取多个用户输入,例如姓名、年龄、体重,则可以使用Scanner对象。

import java.util.Scanner

// simulated input
val input = "Joe 33 200.0"
val line = new Scanner(input)
val name = line.next
val age = line.nextInt
val weight = line.nextDouble

摘自Alvin Alexander的Scala Cookbook:面向对象和函数编程的实用技巧


23

以下是从Scala邮件列表获取的内容(已更新格式和链接):

简短回答:

readInt

长话短说:

如果你想从终端读取内容,请查看Console.scala。 你可以这样使用这些函数:

Console.readInt
另外,为了方便起见,Predef.scala 自动定义了一些对 Console 中函数的快捷方式。由于 Predef 中的内容总是自动导入到任何地方,因此您可以像这样使用它们:
readInt

27
即使已经存在其他地方,我认为在SO上提问是可以的……邮件列表的格式并不是最容易阅读的。 - huynhjl
7
@huynhjl 确实,Stack Overflow 的创建原因之一是因为在邮件列表中搜索非常糟糕。 - Daniel C. Sobral
4
@huynhjl,我同意。我们中的一些人(包括我)通过谷歌得出了这个答案。 - Leif Andersen
要求输入字符串,而不是整数,但是当然答案指向了正确的方向。 :) - user unknown

11
object InputTest extends App{

    println("Type something : ")
    val input = scala.io.StdIn.readLine()
    println("Did you type this ? " + input)

}

这样您就可以要求输入。

scala.io.StdIn.readLine()

8
您可以使用readLine()方法获取用户输入的字符串。
import scala.io.StdIn._

object q1 {
  def main(args:Array[String]):Unit={  
    println("Enter your name : ")
    val a = readLine()
    println("My name is : "+a)
  }
}

您可以使用Scanner类来接受用户输入。
import java.util.Scanner;

object q1 {
  def main(args:Array[String]):Unit={ 
      val scanner = new Scanner(System.in)
    println("Enter your name : ")
    val a = scanner.nextLine()
    println("My name is : "+a)
  }
}

1
无法解析符号readLine。 我是否缺少某种导入? - DFSFOT

1

从用户读取输入的简单示例

val scanner = new java.util.Scanner(System.in)

scala> println("What is your name") What is your name

scala> val name = scanner.nextLine()
name: String = VIRAJ

scala> println(s"My Name is $name")
My Name is VIRAJ

同时,我们可以使用“读取行”功能。
val name = readLine("What is your name ")
What is your name name: String = Viraj

1
在Scala 2中:
import java.io._
object Test {
    // Read user input, output
    def main(args: Array[String]) {

        // create a file writer
        var writer = new PrintWriter(new File("output.txt"))

       // read an int from standard input
       print("Enter the number of lines to read in: ")
       val x: Int = scala.io.StdIn.readLine.toInt

       // read in x number of lines from standard input
       var i=0
       while (i < x) {
           var str: String = scala.io.StdIn.readLine
           writer.write(str + "\n")
           i = i + 1
       }

       // close the writer
       writer.close
     }
}

这段代码从用户获取输入并输出:

[input] Enter the number of lines to read in: 2
one
two

[output] output.txt
one
two

0

readLine() 允许您提示用户并读取其输入作为字符串。

val name = readLine("What's your name? ")

0
Using a thread to poll the input-readLine:

// keystop1.sc

// In Scala- or SBT console/Quick-REPL: :load keystop1.sc
// As Script: scala -savecompiled keystop1.sc

@volatile var isRunning = true
@volatile var isPause = false

val tInput: Thread = new Thread {
  override def run: Unit = {
    var status = ""
        while (isRunning) {
            this.synchronized {
                status = scala.io.StdIn.readLine()
                status match {
                    case "s" => isRunning = false
                    case "p" => isPause = true
                    case "r" => isRunning = true;isPause = false
                    case _ => isRunning = false;isPause = false
                }
                println(s"New status is: $status")
            }
        }
    }
}

tInput.start

var count = 0
var pauseCount = 0

while (isRunning && count < 10){
  println(s"still running long lasting job! $count")
  if (count % 3 == 0) println("(Please press [each + ENTER]: s to stop, p to pause, r to run again!)")
  count += 1
  Thread sleep(2000) // simulating heavy computation
  while (isPause){
      println(s"Taking a break ... $pauseCount")
      Thread sleep(1000)
      pauseCount += 1
      if (pauseCount >= 10){
        isPause = false
        pauseCount = 0
        println(s"Taking a break ... timeout occurred!")
      }
  }
}
isRunning = false
println(s"Computation stopped, please press Enter!")
tInput.join()
println(s"Ok, thank you, good bye!")

-5

请尝试

scala> readint

请尝试使用这个方法


请考虑添加一些解释。 - Sohaib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接