Чтение до нулевого символа в символе Котлина символом из ответа сокета

Так сказать, у меня есть поток, возвращаемый из соединения сокета. Поток возвращается с завершением '\ 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(); } 

Если кто-то знает, как это сделать, общавшись с сокетом с потоками в Котлине. Другое сообщение, которое здесь находится, охватывает чтение всей строки текста. Сокет возвращает более длинную строку, ограниченную символом '\ 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() } 

Вот более или менее прямой перевод вашего Java-кода в Kotlin:

 fun readUpToNull(inputStream: InputStream): String { return buildString { while (true) { val ch = inputStream.read().toChar() if (ch == '\u0000') break append(ch) } } } 
Intereting Posts
Можем ли мы определить наши аксессоры без значения init? Почему вызовы должны быть вызваны с помощью вызова класса класса? Что представляет собой запечатанный модификатор в Котлин? Головная боль наследования котиновских дженериков «Невозможно преобразовать объект типа java.lang.String в тип com.android.projectrc.Listing» при использовании Firebase RecyclerAdapter Получение пустого списка из области, когда я запускаю приложение Android в первый раз. Какое правильное место для запуска службы в архитектуре MVVM Android Вызвать getMeasuredWidth () или getWidth () для возврата RecyclerView 0 при привязке данных Выйти из анонимной функции в котлин Рекурсивный вызов по ленивому значению с использованием LiveData и ObserveForever Кодирование запроса почтальона В чем разница между нормальным классом и классом данных в котлине Как скомпилировать тестовый код модуля Kotlin, который использует hamcrest 'is' Код Vertx Sync работает несколько раз Экземпляр фрагмента сохраняется, но дочерний фрагмент не повторно прикреплен