所以说我有一个从套接字连接返回的流。使用'\ 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调用的单元测试。
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()
}
答案 0 :(得分:1)
这里有一个或多或少直接的Java代码到Kotlin的翻译:
fun readUpToNull(inputStream: InputStream): String {
return buildString {
while (true) {
val ch = inputStream.read().toChar()
if (ch == '\u0000') break
append(ch)
}
}
}