2017-06-13 52 views
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() 
} 
+0

的可能的复制[在科特林,我怎么读的InputStream的全部内容为一个字符串? ](https://stackoverflow.com/questions/39500045/in-kotlin-how-do-iread-the-entire-contents-of-an-inputstream-into-a-string) –

+0

我们不知道数据的格式是什么。如果您正在读取,直到您收到零*字节*,然后以字节读取并检查此零字节。如果您正在读取特定字符集的编码字节流,请为该字符集创建适当的读取器并读入并检查单个字符。 –

+0

我正在阅读流的空字符。流从UTF-8服务器返回为UTF-8。 –

回答

0

这里是你的Java代码来科特林更或多或少直接翻译:

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