如何在Android应用程序中获取每行进程输出?

wlzqhblo  于 2023-09-28  发布在  Android
关注(0)|答案(1)|浏览(123)

我使用这个代码:

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)结果将被追加。我只需要每次迭代的实际输出和单行输出。

r1zk6ea1

r1zk6ea11#

相当优雅的Kotlin式解决方案:

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允许“it”变为空,以便执行最新的检查。这是必要的,以避免崩溃。

相关问题