InputStream to String di Kotlin

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan mengetahui cara membaca InputStream menjadi String.

Kotlin menyediakan cara mudah untuk melakukan penukaran. Namun, masih ada beberapa nuansa yang perlu dipertimbangkan ketika bekerja dengan sumber. Selain itu, kami akan merangkumi kes khas, seperti membaca hingga watak berhenti .

2. Pembaca Buffered

InputStream adalah abstraksi di sekitar aliran byte yang disusun . Sumber data yang mendasari boleh berupa fail, sambungan rangkaian atau sumber lain yang mengeluarkan bait. Mari gunakan fail ringkas yang mengandungi data berikut:

Computer programming can be a hassle It's like trying to take a defended castle

Penyelesaian pertama yang mungkin kami cuba adalah membaca fail secara manual baris demi baris:

val reader = BufferedReader(inputStream.reader()) val content = StringBuilder() try { var line = reader.readLine() while (line != null) { content.append(line) line = reader.readLine() } } finally { reader.close() }

Pertama, kami menggunakan kelas BufferedReader untuk membungkus InputStream dan kemudian membaca sehingga tidak ada baris yang tersisa di aliran. Selanjutnya, kami mengelilingi logik membaca dengan pernyataan cuba-akhirnya untuk akhirnya menutup aliran . Secara keseluruhan, terdapat banyak kod plat boiler.

Bolehkah kita menjadikannya lebih padat dan mudah dibaca?

Tentunya! Pada mulanya, kita dapat mempermudah coretan dengan menggunakan fungsi readText () . Ia membaca aliran input sepenuhnya sebagai Rentetan . Oleh yang demikian, kami dapat mengubah semula coretan kami seperti berikut:

val reader = BufferedReader(inputStream.reader()) var content: String try { content = reader.readText() } finally { reader.close() }

Walau bagaimanapun, kita masih mempunyai sekatan percubaan akhirnya . Untungnya, Kotlin membenarkan pengendalian sumber secara automatik. Mari lihat baris kod seterusnya:

val content = inputStream.bufferedReader().use(BufferedReader::readText) assertEquals(fileFullContent, content) 

Penyelesaian satu baris ini kelihatan mudah, namun banyak perkara berlaku di bawahnya. Satu perkara penting dalam kod di atas adalah panggilan fungsi () . Fungsi peluasan ini melaksanakan blok pada sumber yang mengimplementasikan antara muka Closable . Akhirnya, apabila blok itu dilaksanakan Kotlin menutup sumber untuk kita.

3. Hentikan watak

Pada saat yang sama, mungkin ada kasus ketika kita perlu membaca konten hingga karakter tertentu . Mari tentukan fungsi lanjutan untuk kelas InputStream :

fun InputStream.readUpToChar(stopChar: Char): String { val stringBuilder = StringBuilder() var currentChar = this.read().toChar() while (currentChar != stopChar) { stringBuilder.append(currentChar) currentChar = this.read().toChar() if (this.available() <= 0) { stringBuilder.append(currentChar) break } } return stringBuilder.toString() }

Fungsi ini membaca bait dari aliran input sehingga watak berhenti muncul . Pada masa yang sama, dalam usaha untuk mengelakkan gelung tak terhingga, kita panggil tersedia () kaedah untuk memeriksa sama ada aliran mempunyai apa-apa data kiri. Jadi, jika tidak ada watak berhenti dalam aliran, maka keseluruhan aliran akan dibaca.

Sebaliknya, tidak semua subkelas kelas InputStream memberikan implementasi untuk kaedah yang tersedia () . Oleh itu, kita harus memastikan bahawa kaedah tersebut dilaksanakan dengan betul sebelum menggunakan fungsi peluasan.

Mari kembali ke contoh kami dan baca teks hingga watak ruang kosong pertama (''):

val content = inputStream.use { it.readUpToChar(' ') } assertEquals("Computer", content) 

Akibatnya, kita akan mendapatkan teks hingga watak berhenti. Dengan cara yang sama, jangan lupa untuk membungkus blok dengan fungsi penggunaan () untuk menutup aliran secara automatik .

4. Kesimpulan

Dalam artikel ini, kami telah melihat cara mengubah InputStream ke String di Kotlin. Kotlin menyediakan cara ringkas untuk bekerja dengan aliran data, tetapi selalu bernilai mengetahui apa yang berlaku secara dalaman.

Seperti biasa, pelaksanaan semua contoh ini sudah selesai di Github.