从套接字响应中逐字读入Kotlin字符中的空字符

所以说我有一个从套接字连接返回的流。 流被返回终止’\ 0’,但在kotlin我似乎无法得到这个以相同的方式工作。 下面的代码是在Java中,我可能只是看起来很简单。

public final String readUpToNull(InputStream inputStream) throws IOException { StringBuilder builder = new StringBuilder(); char ch; while ((ch = (char) inputStream.read()) != '\0') { builder.append(ch); } return builder.toString(); } 

如果有人知道如何在与Kotlin中的流进行通信的同时进行此操作。 在这里的另一篇文章是覆盖阅读全文的文字。 套接字返回由’\ 0’分隔的更长的字符串。 所以问题是我需要能够加载第一个字符串,然后第二个字符串。

 Example Server : hello\0 xml stuff all right here\0 Client: read hello Client: read xml stuff all right here 

来自kotlinlang.org的示例代码显示了这是一个使用Java to Kotlin转换器的解决方案。 请注意,由于while语句中的赋值,此代码无法编译。

 @Throws(IOException::class) fun readUpToNull(inputStream:InputStream):String { val builder = StringBuilder() val ch:Char while ((ch = inputStream.read() as Char) != '\u0000') { builder.append(ch) } return builder.toString() } 

这是我到目前为止,但这个实现只是挂起进程,并锁定API调用的unit testing。

 fun readUpToNull(stream: InputStream): String { val reader = BufferedReader(InputStreamReader(stream)) val builder = StringBuilder() while (true) { val characters = reader.readText().toCharArray() characters.takeWhile { it != '\u0000' }.forEach { builder.append(it) } break } return builder.toString() } 

这里有一个或多或少的Java代码直接翻译成Kotlin:

 fun readUpToNull(inputStream: InputStream): String { return buildString { while (true) { val ch = inputStream.read().toChar() if (ch == '\u0000') break append(ch) } } }