InputStream na reťazec v Kotline

1. Prehľad

V tomto krátkom návode sa dozvieme, ako čítať InputStream do a String.

Kotlin poskytuje ľahký spôsob uskutočnenia konverzie. Pri práci so zdrojmi však treba brať do úvahy niektoré nuansy. Navyše sa budeme venovať špeciálnym prípadom, napríklad čítanie až po zastavovací znak.

2. Čítačka v medzipamäti

InputStream je abstrakcia okolo usporiadaného toku bajtov. Zdrojom podkladových údajov môže byť súbor, sieťové pripojenie alebo akýkoľvek iný zdroj vysielajúci bajty. Použime jednoduchý súbor, ktorý obsahuje nasledujúce údaje:

Počítačové programovanie môže byť problém. Je to ako pokúšať sa získať dobytý hrad

Prvým riešením, ktoré by sme mohli vyskúšať, je manuálne načítanie súboru po riadkoch:

val reader = BufferedReader (inputStream.reader ()) val content = StringBuilder () vyskúšajte {var line = reader.readLine () while (line! = null) {content.append (line) line = reader.readLine ()}} konečne {reader.close ()}

Najprv sme použili BufferedReader triedy zabaliť InputStream a potom čítať, kým v streame nezostanú žiadne riadky. Ďalej sme obklopili logiku čítania znakom skús-konečne vyhlásenie k konečne zatvorte prúd. Dokopy existuje veľa štandardných kódov.

Mohli by sme ho urobiť kompaktnejším a čitateľnejším?

Absolútne! Najprv môžeme úryvok zjednodušiť pomocou readText () funkcie. Číta vstupný prúd úplne ako a String. Podľa toho môžeme náš úryvok refaktorovať takto:

val reader = BufferedReader (inputStream.reader ()) var obsah: Vyskúšajte reťazec {content = reader.readText ()} konečne {reader.close ()}

To však stále máme skús-konečne blokovať. Kotlin našťastie umožňuje manipuláciu so správou zdrojov pseudo-automatickým spôsobom. Pozrime sa na ďalšie riadky kódu:

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

Toto jednoriadkové riešenie vyzerá jednoducho, napriek tomu sa pod kapotou deje veľa vecí. Jedným z dôležitých bodov v kóde vyššie je volanie použitie () funkcie. Táto funkcia rozšírenia vykoná blok na prostriedku, ktorý implementuje Uzatvárateľné rozhranie. Nakoniec, keď je blok vykonaný Kotlin pre nás uzatvára zdroj.

3. Stopka

Zároveň môže nastať prípad, keď budeme musieť čítať obsah až po konkrétny znak. Definujme funkciu rozšírenia pre InputStream trieda:

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 ()}

Táto funkcia číta bajty zo vstupného toku, kým sa nezobrazí znak zastavenia. Zároveň v poriadku aby sme zabránili nekonečnej slučke, hovoríme k dispozícii () metóda skontrolovať, či v streame zostali nejaké údaje. Pokiaľ teda v streame nie je žiadny zastavovací znak, bude načítaný celý stream.

Na druhej strane nie všetky podtriedy InputStream triedy poskytujú implementáciu pre k dispozícii () metóda. Pred použitím funkcie rozšírenia teda musíme zabezpečiť správnu implementáciu metódy.

Vráťme sa k nášmu príkladu a čítať text až po prvý prázdny znak (‘ ‘):

val content = inputStream.use {it.readUpToChar ('')} assertEquals ("počítač", obsah) 

Vo výsledku dostaneme text až po koncový znak. Rovnakým spôsobom nezabudnite zabaliť blok s použitie () funkcia automaticky uzavrie stream.

4. Záver

V tomto článku sme videli, ako previesť súbor InputStream do a String v Kotline. Kotlin poskytuje stručný spôsob práce s prúdmi údajov, ale vždy stojí za to vedieť, čo sa deje interne.

Ako obvykle je implementácia všetkých týchto príkladov na Githube ukončená.


$config[zx-auto] not found$config[zx-overlay] not found