InputStream u string u Kotlinu

1. Pregled

U ovom kratkom vodiču saznat ćemo kako čitati InputStream u a Niz.

Kotlin pruža jednostavan način za pretvorbu. Međutim, još uvijek treba uzeti u obzir neke nijanse prilikom rada s resursima. Osim toga, pokrivat ćemo posebne slučajeve, poput čitanje do zaustavljanja znaka.

2. Čitač u baferu

InputStream je apstrakcija oko uređenog toka bajtova. Izvorni izvor podataka može biti datoteka, mrežna veza ili bilo koji drugi izvor koji emitira bajtove. Upotrijebimo jednostavnu datoteku koja sadrži sljedeće podatke:

Računalno programiranje može biti gnjavaža To je poput pokušaja zauzimanja obranjenog zamka

Prvo rješenje koje bismo mogli pokušati jest ručno pročitati datoteku redak po redak:

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

Prvo smo koristili BufferedReader razred za umotavanje InputStream a zatim čitajte dok u toku ne ostane redak. Nadalje, logiku čitanja okružili smo probaj-napokon izjava za napokon zatvorite potok. Sve u svemu, postoji puno tipičnih kodova.

Možemo li ga učiniti kompaktnijim i čitljivijim?

Apsolutno! Isprva isječak možemo pojednostaviti pomoću readText () funkcija. U potpunosti čita ulazni tok kao a Niz. Sukladno tome, svoj isječak možemo preoblikovati na sljedeći način:

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

Međutim, to još uvijek imamo probaj-napokon blok. Srećom, Kotlin omogućuje rukovanje upravljanjem resursima na pseudo-automatski način. Pogledajmo sljedeće retke koda:

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

Ovo jednoredno rješenje izgleda jednostavno, unatoč tome, puno se toga događa ispod haube. Jedna važna točka u gornjem kodu je poziv koristiti() funkcija. Ova funkcija proširenja izvršava blok na resursu koji implementira Može se zatvoriti sučelje. Konačno, kada se izvrši blok Kotlin nam zatvara resurs.

3. Stop znak

Istodobno, može postojati slučaj kada trebamo čitati sadržaj do određenog znaka. Definirajmo funkciju proširenja za InputStream razred:

zabavno InputStream.readUpToChar (stopChar: Char): Niz {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 ()}

Ova funkcija čita bajtove iz ulaznog toka dok se ne pojavi znak zaustavljanja. Istodobno, redom da bismo spriječili beskonačnu petlju, nazivamo dostupno() metoda kako biste provjerili ima li u streamu preostalih podataka. Dakle, ako u streamu nema znaka stop, tada će se čitati cijeli stream.

S druge strane, nisu sve podrazrede InputStream klasa osigurati provedbu za dostupno() metoda. Slijedom toga, moramo osigurati da se metoda pravilno implementira prije korištenja funkcije proširenja.

Vratimo se našem primjeru i pročitajte tekst do prvog razmaka (‘ ‘):

val content = inputStream.use {it.readUpToChar ('')} assertEquals ("Računalo", sadržaj) 

Kao rezultat, dobit ćemo tekst do znaka zaustavljanja. Na isti način, ne zaboravite i to omotajte blok s koristiti() funkcija za automatsko zatvaranje prijenosa.

4. Zaključak

U ovom smo članku vidjeli kako pretvoriti InputStream do a Niz u Kotlinu. Kotlin pruža sažet način rada s protocima podataka, ali uvijek vrijedi znati što se interno događa.

Kao i obično, implementacija svih ovih primjera završena je na Githubu.


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