InputStream to String i Kotlin

1. Oversigt

I denne korte vejledning finder vi ud af, hvordan man læser en InputStream ind i en Snor.

Kotlin giver en nem måde at udføre konverteringen på. Der er dog stadig nogle nuancer at overveje, når man arbejder med ressourcer. Plus, vi dækker specielle tilfælde, ligesom læser op til et stopkarakter.

2. Buffered Reader

InputStream er en abstraktion omkring en ordnet strøm af bytes. En underliggende datakilde kan være en fil, en netværksforbindelse eller enhver anden kilde, der udsender bytes. Lad os bruge en simpel fil, der indeholder følgende data:

Computerprogrammering kan være besvær Det er som at prøve at tage et forsvaret slot

Den første løsning, som vi måske prøver, er at læse filen manuelt linje for linje:

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

Først brugte vi BufferedReader klasse til at pakke InputStream og læs derefter, indtil der ikke er nogen linjer tilbage i strømmen. Desuden omgav vi læselogik ved prøv endelig erklæring til endelig luk strømmen. Alt i alt er der en masse kedelpladekode.

Kunne vi gøre det mere kompakt og læsbart?

Absolut! Først kan vi forenkle uddraget ved hjælp af readText () fungere. Den læser inputstrømmen fuldstændigt som en Snor. Derfor kan vi omlægge vores uddrag som følger:

val-læser = BufferedReader (inputStream.reader ()) var indhold: String prøve {content = reader.readText ()} endelig {reader.close ()}

Det har vi dog stadig prøv endelig blok. Heldigvis tillader Kotlin håndtering af ressourcehåndtering på en pseudo-automatisk måde. Lad os se på de næste kodelinjer:

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

Denne one-line løsning ser enkel ud, ikke desto mindre sker der meget under emhætten. Et vigtigt punkt i ovenstående kode er opkaldet fra brug() fungere. Denne udvidelsesfunktion udfører en blok på en ressource, der implementerer Kan lukkes interface. Endelig, når blokken udføres Kotlin lukker ressourcen for os.

3. Stop tegn

Samtidig kan der være et tilfælde, hvor vi har brug for det læse indhold op til en bestemt karakter. Lad os definere en udvidelsesfunktion til InputStream klasse:

sjov InputStream.readUpToChar (stopChar: Char): Streng {val stringBuilder = StringBuilder () var currentChar = this.read (). toChar () mens (currentChar! = stopChar) {stringBuilder.append (currentChar) currentChar = this.read ( ) .toChar () hvis (this.available () <= 0) {stringBuilder.append (currentChar) break}} return stringBuilder.toString ()}

Denne funktion læser byte fra en inputstrøm, indtil et stoptegn vises. Samtidig i orden for at forhindre den uendelige løkke kalder vi ledig() metode for at kontrollere, om streamen har nogen data tilbage. Så hvis der ikke er noget stopkarakter i en stream, læses en hel stream.

På den anden side er ikke alle underklasser af InputStream klasse giver en implementering af ledig() metode. Derfor skal vi sikre os, at metoden implementeres korrekt, inden vi bruger udvidelsesfunktionen.

Lad os vende tilbage til vores eksempel og læse tekst op til det første blanktegn (‘ ‘):

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

Som et resultat får vi teksten op til stopkarakteren. På samme måde skal du ikke glemme det indpak blokken med brug() funktion til automatisk at lukke strømmen.

4. Konklusion

I denne artikel har vi set, hvordan man konverterer en InputStream til en Snor i Kotlin. Kotlin giver en kortfattet måde at arbejde med datastrømme på, men det er altid værd at vide, hvad der foregår internt.

Som sædvanlig er implementeringen af ​​alle disse eksempler afsluttet på Github.


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