如何在 android 应用程序中获取每行进程输出?
How to get per line process output in an android app?
我正在使用此代码:
var reader: Int = 0
val buffer = CharArray(4096)
var output = StringBuilder()
val process = processBuilder.start()
var inputStream = BufferedReader(InputStreamReader(process.getInputStream()));
while ({ reader = inputStream.read(buffer); reader }() > 0) {
output.append(buffer, 0, reader)
println("Debug: " + output.toString())
}
inputStream.close()
process.waitFor()
它工作正常,但我有 2 个问题使其无法满足我的需求:
1) 它不会实时检索每一行。它缓冲了实际输出中的一些行,并在每个循环中显示它们。
2) 附加结果。我只需要每次迭代输出的实际和单行。
相当优雅Kotlin-ish解决方案:
var output: String = ""
val process = processBuilder.start()
val inputStream = BufferedReader(InputStreamReader(process.getInputStream()))
while ( inputStream.readLine()?.also { output = it } != null) {
println("Debug: " + output)
}
inputStream.close()
process.waitFor()
while 语句等同于 Java 的:
while ( (output = inputStream.readLine()) != null) {
println("Debug: " + output)
}
在 Kotlin 中,您不能在语句内分配变量,但使用 also 链,您可以包含要同时执行的额外代码。 readLine 之后的 Elvis 运算符 (?) 允许 "it" 变为 null 以便执行最新检查。这是避免崩溃所必需的。
我正在使用此代码:
var reader: Int = 0
val buffer = CharArray(4096)
var output = StringBuilder()
val process = processBuilder.start()
var inputStream = BufferedReader(InputStreamReader(process.getInputStream()));
while ({ reader = inputStream.read(buffer); reader }() > 0) {
output.append(buffer, 0, reader)
println("Debug: " + output.toString())
}
inputStream.close()
process.waitFor()
它工作正常,但我有 2 个问题使其无法满足我的需求:
1) 它不会实时检索每一行。它缓冲了实际输出中的一些行,并在每个循环中显示它们。
2) 附加结果。我只需要每次迭代输出的实际和单行。
相当优雅Kotlin-ish解决方案:
var output: String = ""
val process = processBuilder.start()
val inputStream = BufferedReader(InputStreamReader(process.getInputStream()))
while ( inputStream.readLine()?.also { output = it } != null) {
println("Debug: " + output)
}
inputStream.close()
process.waitFor()
while 语句等同于 Java 的:
while ( (output = inputStream.readLine()) != null) {
println("Debug: " + output)
}
在 Kotlin 中,您不能在语句内分配变量,但使用 also 链,您可以包含要同时执行的额外代码。 readLine 之后的 Elvis 运算符 (?) 允许 "it" 变为 null 以便执行最新检查。这是避免崩溃所必需的。