InputStream to String i Kotlin

1. Oversikt

I denne korte opplæringen vil vi finne ut hvordan du leser en InputStream inn i en String.

Kotlin gir en enkel måte å utføre konverteringen på. Imidlertid er det fortsatt noen nyanser å vurdere når du arbeider med ressurser. I tillegg vil vi dekke spesielle tilfeller, som lese opp til en stopper.

2. Buffered Reader

InputStream er en abstraksjon rundt en ordnet strøm av byte. En underliggende datakilde kan være en fil, en nettverkstilkobling eller andre kilder som sender ut byte. La oss bruke en enkel fil som inneholder følgende data:

Dataprogrammering kan være et problem. Det er som å prøve å ta et forsvaret slott

Den første løsningen vi kan prøve er å lese filen manuelt linje for linje:

val reader = BufferedReader (inputStream.reader ()) val content = StringBuilder () prøv {var line = reader.readLine () while (line! = null) {content.append (line) line = reader.readLine ()}} endelig {reader.close ()}

Først brukte vi BufferedReader klasse for å pakke inn InputStream og les deretter til det ikke er noen linjer igjen i strømmen. Videre omringet vi leselogikk av prøv-endelig uttalelse til til slutt steng strømmen. Alt i alt er det mye kokerplatekode.

Kan vi gjøre det mer kompakt og lesbart?

Absolutt! Først kan vi forenkle kodebiten ved å bruke readText () funksjon. Den leser inngangsstrømmen fullstendig som en String. Følgelig kan vi omformulere kodebiten vår på følgende måte:

val reader = BufferedReader (inputStream.reader ()) var content: Streng prøv {content = reader.readText ()} til slutt {reader.close ()}

Imidlertid har vi fortsatt det prøv-endelig blokkere. Heldigvis tillater Kotlin å håndtere ressursadministrasjon på en pseudo-automatisk måte. La oss se på de neste kodelinjene:

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

Denne enlinjeløsningen ser enkel ut, likevel skjer det mye under panseret. Et viktig poeng i koden ovenfor er kallet til bruk() funksjon. Denne utvidelsesfunksjonen utfører en blokk på en ressurs som implementerer Lukkbar grensesnitt. Til slutt når blokken er utført Kotlin stenger ressursen for oss.

3. Stopp karakter

Samtidig kan det være et tilfelle når vi trenger det lese innhold opp til et bestemt tegn. La oss definere en utvidelsesfunksjon for InputStream klasse:

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

Denne funksjonen leser byte fra en inngangsstrøm til et stopptegn vises. Samtidig i orden for å forhindre den uendelige løkken, kaller vi tilgjengelig() metode for å sjekke om strømmen har data igjen. Så hvis det ikke er noe stoppkarakter i en strøm, vil en hel strøm bli lest.

På den annen side, ikke alle underklasser av InputStream klasse gi en implementering for tilgjengelig() metode. Derfor må vi sørge for at metoden er implementert riktig før vi bruker utvidelsesfunksjonen.

La oss komme tilbake til vårt eksempel og les tekst opp til det første mellomromstegnet (‘ ‘):

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

Som et resultat får vi teksten til stoppkarakteren. På samme måte, ikke glem å vikle blokken med bruk() funksjon for å automatisk lukke strømmen.

4. Konklusjon

I denne artikkelen har vi sett hvordan vi konverterer en InputStream til en String i Kotlin. Kotlin gir en kortfattet måte å jobbe med datastrømmer på, men det er alltid verdt å vite hva som skjer internt.

Som vanlig er implementeringen av alle disse eksemplene over på Github.


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