1
所以说我有一个从套接字连接返回的流。流被返回以'\ 0'结尾,但在kotlin中我似乎无法得到这个以相同的方式工作。下面的代码是用Java编写的,我可能只是看起来很简单。从套接字响应中按字符读取Kotlin字符中的空字符
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()
}
的可能的复制[在科特林,我怎么读的InputStream的全部内容为一个字符串? ](https://stackoverflow.com/questions/39500045/in-kotlin-how-do-iread-the-entire-contents-of-an-inputstream-into-a-string) –
我们不知道数据的格式是什么。如果您正在读取,直到您收到零*字节*,然后以字节读取并检查此零字节。如果您正在读取特定字符集的编码字节流,请为该字符集创建适当的读取器并读入并检查单个字符。 –
我正在阅读流的空字符。流从UTF-8服务器返回为UTF-8。 –