【发布时间】:2017-11-15 10:34:36
【问题描述】:
假设我有一个从套接字连接返回的流。返回的流以 '\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 到 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()
}
【问题讨论】:
-
我们不知道数据的格式是什么。如果您正在阅读直到收到零 byte,则读取字节并检查此零字节。如果您正在读取特定字符集的编码字节流,则为该字符集创建适当的阅读器并读取并检查单个字符。
-
我正在阅读流的空字符。流从 tomcat 服务器以 UTF-8 格式返回。
-
Kotlin 中缓冲读取器使用的默认字符集是 UTF-8,因此不传递编码不是导致问题的原因。