9.1.2 读取标准输入

原文链接: https://kotlinlang.org/docs/read-standard-input.html

9.1.2 读取标准输入

使用 readln() 函数从标准输入读取数据。它会把整行作为字符串读取:

1
2
3
4
5
6
7
8
9
// 读取用户输入并存入变量。例如:Hi there!
val myInput = readln()

println(myInput)
// Hi there!

// 读取并打印用户输入,但不把它存入变量。例如:Hi, Kotlin!
println(readln())
// Hi, Kotlin!

你也可以把多行输入作为一个字符串读取。使用 joinToString() 函数把这些行组合起来:

1
2
val input = generateSequence(::readlnOrNull)
  .joinToString("\n")

注意: 请使用 readlnOrNull()代替 readln(),以便读取输入直到文件结束而不抛出异常。

要处理字符串之外的数据类型,你可以用 .toInt()、.toLong()、.toDouble()、.toFloat() 或 .toBoolean() 这类转换函数来转换输入。你还可以读取多个不同类型的数据,并分别存入变量:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// 把输入的字符串转换为整数值。例如:12
val myNumber = readln().toInt()
println(myNumber)
// 12

// 把输入的字符串转换为 double 值。例如:345
val myDouble = readln().toDouble()
println(myDouble)
// 345.0

// 把输入的字符串转换为布尔值。例如:true
val myBoolean = readln().toBoolean()
println(myBoolean)
// true

这些转换函数假定用户输入的是目标数据类型的有效表示。例如,用 .toInt() 把 “hello” 转换为整数会抛出异常,因为该函数期望字符串输入中是数字。

要读取用分隔符分隔的多个输入元素,请使用指定分隔符的 .split() 函数。下面的代码示例从标准输入读取数据,按分隔符把输入拆分为元素列表,并把列表中的每个元素转换为特定类型:

1
2
3
4
5
6
7
8
9
// 读取输入,假定元素以空格分隔,并把它们转换为整数。例如:1 2 3
val numbers = readln().split(' ').map { it.toInt() }
println(numbers)
// [1, 2, 3]

// 读取输入,假定元素以逗号分隔,并把它们转换为 double。例如:4,5,6
val doubles = readln().split(',').map { it.toDouble() }
println(doubles)
// [4.0, 5.0, 6.0]

注意: 关于在 Kotlin/JVM 中读取用户输入的其他方式,请参阅使用 Java Scanner 的标准输入。

安全地处理标准输入

你可以使用 .toIntOrNull() 函数安全地把用户输入的字符串转换为整数。如果转换成功,该函数返回整数。不过,如果输入不是整数的有效表示,它会返回 null:

1
2
3
4
5
6
7
8
9
// 如果输入无效则返回 null。例如:Hello!
val wrongInt = readln().toIntOrNull()
println(wrongInt)
// null

// 把有效的输入字符串转换为整数。例如:13
val correctInt = readln().toIntOrNull()
println(correctInt)
// 13

readlnOrNull() 函数也有助于安全地处理用户输入。readlnOrNull() 函数从标准输入读取数据,并在到达输入末尾时返回 null,而 readln() 在这种情况下会抛出异常。