【问题标题】:Reading up to null character in Kotlin character by character from socket response从套接字响应中逐个字符地读取 Kotlin 中的空字符
【发布时间】: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,因此不传递编码不是导致问题的原因。

标签: java sockets io kotlin


【解决方案1】:

这是您的 Java 代码到 Kotlin 的或多或少的直接翻译:

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

【讨论】:

    猜你喜欢
    • 2012-07-22
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多