2017-06-13 47 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) 
     } 
    } 
}