1. OutputStream
klasse
Vi har nylig utforsket inndatastrømmer. Det er på tide å snakke om utgangsstrømmer.
Klassen OutputStream
er overordnet klasse for alle klasser som støtter byteutdata. Dette er en abstrakt klasse som ikke gjør noe alene, men den har etterkommerklasser for enhver anledning.
Det høres ekstremt komplisert ut. For å si det enklere, opererer denne klassen på bytes, og ikke for eksempel tegn eller andre datatyper. Og det at den er abstrakt betyr at vi vanligvis ikke bruker den, men heller en av dens etterkommerklasser. For eksempel FileOutputStream
og lignende.
Men tilbake til OutputStream
klassen. Denne klassen har metoder som alle dens etterkommerklasser må implementere. Her er de viktigste:
Metoder | Beskrivelse |
---|---|
|
Skriver én byte (ikke en int ) til strømmen. |
|
Skriver en rekke byte til strømmen |
|
Skriver en del av en rekke byte til strømmen |
|
Skriver alle data som er lagret i bufferen til strømmen |
|
Lukker strømmen |
Når du oppretter et objekt av en klasse som arver InputStream
, spesifiserer du vanligvis et kildeobjekt som InputStream
leser data fra. Når du oppretter et objekt av en klasse som arver OutputStream
, spesifiserer du vanligvis også målobjektet eller strømmen som data skal skrives til.
La oss kort gå gjennom alle metodene i klassen OutputStream
:
write(int b)
metode
Denne metoden skriver en byte (ikke en int
) til utdatastrømmen. Den beståtte verdien castes til en byte, og int-ens tre første byte forkastes.
write(byte[] buffer)
metode
Skriver den gitte matrisen med byte til utdatastrømmen. Det er det.
write(byte[] buffer, int offset, int length)
metode
Skriver en del av den beståtte rekken av byte til utdatastrømmen. Forskyvningsvariabelen indikerer indeksen til det første elementet i matrisen, og length
er lengden på delsettet som skal skrives.
flush()
metode
Metoden flush()
brukes til å tvinge alle data som potensielt er bufret i den gjeldende strømmen til å skrives til målstrømmen. Dette er relevant ved bruk av buffering og/eller flere strømobjekter arrangert i en kjede.
close()
metode
Skriver alle uskrevne data til målobjektet. Metoden close()
trenger ikke kalles hvis du bruker en try-with-resources
blokk.
Eksempel på kopiering av en fil
Kode | Merk |
---|---|
|
InputStream for å lese fra en fil OutputStream for å skrive til en fil Buffer som vi skal lese dataene inn i Så lenge det er data i strømmen Les data inn i bufferen Skriv dataene fra bufferen til den andre strømmen |
2. Writer
klasse
Klassen Writer
er nøyaktig den samme som OutputStream
klassen, men bare én forskjell igjen: den fungerer med tegn ( char
) i stedet for byte.
Dette er en abstrakt klasse: du kan ikke lage objekter av Writer
klassen. Hovedmålet er å være en felles foreldreklasse for hundrevis av etterkommerklasser og å gi dem vanlige metoder for å jobbe med karakterstrømmer.
Metoder for Writer
klassen (og alle dens etterkommerklasser):
Metoder | Beskrivelse |
---|---|
|
Skriver ett tegn (ikke et int ) til strømmen. |
|
Skriver en rekke tegn til strømmen |
|
Skriver en del av en rekke tegn til strømmen |
|
Skriver en streng til strømmen |
|
Skriver en del av en streng til strømmen |
|
Skriver alle data som er lagret i bufferen til strømmen |
|
Lukker strømmen |
Metodene ligner veldig på metodene i OutputStream
klassen, men de fungerer med tegn i stedet for byte.
Beskrivelse av metoder:
write(int b)
metode
Denne metoden skriver et enkelt tegn ( char
— ikke et int
) til utdatastrømmen. Den beståtte verdien kastes til en char
, og de to første bytene forkastes.
write(char[] buffer)
metode
Skriver den gitte rekken av tegn til utdatastrømmen.
write(char[] buffer, int offset, int length)
metode
Skriver en del av den beståtte rekken av tegn til utdatastrømmen. Variabelen offset
indikerer indeksen til det første elementet i matrisen, og length
er lengden på delsettet som skal skrives.
write(String str)
metode
Skriver den gitte strengen til utdatastrømmen.
write(String str, int offset, int length)
metode
Skriver en del av den gitte strengen til utdatastrømmen: strengen konverteres til en rekke tegn. Variabelen offset
indikerer indeksen til det første elementet i matrisen, og length
er lengden på delsettet som skal skrives.
flush()
metode
Metoden flush()
brukes til å tvinge alle data som potensielt er bufret i den gjeldende strømmen til å skrives til målstrømmen. Dette er relevant ved bruk av buffering og/eller flere strømobjekter arrangert i en kjede.
close()
metode
Skriver alle uskrevne data til målobjektet. Metoden close()
trenger ikke kalles hvis du bruker en try-with-resources
blokk.
Eksempel på et program som kopierer en tekstfil:
Kode | Merk |
---|---|
|
Reader for å lese fra en fil Writer for å skrive til en fil Buffer som vi skal lese dataene inn i Så lenge det er data i strømmen Les data inn i en buffer Skriv dataene fra bufferen til den andre strømmen |
StringWriter
klasse
Det er en annen interessant klasse som arver Writer
klassen: den heter StringWriter
. Den inneholder en foranderlig streng - et StringBuffer
objekt. Og hver gang du "skriver" noe til objektet StringWriter
, blir teksten ganske enkelt lagt til den interne bufferen.
Eksempel:
Kode | Merk |
---|---|
|
En måltegnstrøm ( StringWriter ) opprettes En streng skrives til bufferen inne i StringWriter En streng skrives til bufferen inne i StringWriter Konvertering av innholdet i et objekt til en streng |
I dette tilfellet StringWriter
er klassen i hovedsak en innpakning over StringBuffer
klassen, men StringWriter
klassen er en etterkommer av Writer
strømklassen, og den kan brukes i kjeder av strømobjekter. Dette er en ganske nyttig egenskap i praksis.
3. PrintStream
klasse
Utgangsstrømklasser kan også settes inn i en kjede med mellomstrømmer som skriver data til målstrømmen som sendes til dem. Det generelle synet på samspillet mellom disse strømmene ser slik ut:
Den mest interessante og allsidige av alle mellomliggende utdatastrømmer er PrintStream
. Den har titalls metoder og så mange som 12 konstruktører.
Klassen PrintStream
arver FilterOutputStream
klassen, som arver OutputStream
. Det betyr at PrintStream
klassen har alle metodene til foreldreklassene i tillegg til sine egne metoder . Her er de mest interessante:
Metoder | Beskrivelse |
---|---|
|
Konverterer det beståtte objektet til en streng og sender det ut til målstrømmen. |
|
Konverterer det beståtte objektet til en streng og sender det ut til målstrømmen. Legger til et linjeskift på slutten |
|
Sender ut et linjeskifttegn til målstrømmen |
|
Konstruerer og sender ut en streng basert på formatstrengen og de beståtte argumentene; lik String.format() metoden |
Og hvor er disse titalls metodene, spør du?
Vel, den har mange varianter av print()
og println()
metoder med forskjellige parametere. De kan oppsummeres i denne tabellen.
Vi vil ikke dykke ned i disse metodene, fordi du allerede kjenner dem godt. Kan du gjette hva jeg vil til?
Husker du System.out.println()
? Men det kan skrives på to linjer:
Kode | Konsollutgang |
---|---|
|
|
Vår favorittkommando er et kall til metoden på den statiske variabelen til klassen. Og denne variabelens type er .System.out.println()
println()
out
System
PrintStream
På mange CodeGym-nivåer, og i nesten alle oppgaver, har du kalt klassens metoder PrintStream
uten å vite det!
Praktisk bruk
Java har denne interessante klassen kalt ByteArrayOutputStream
, som er en dynamisk voksende byte-array som arver OutputStream
.
Et ByteArrayOutputStream
objekt og PrintStream
objekt kan lenkes slik:
Kode | Beskrivelse |
---|---|
|
Lag en skrivebuffer i minnet Pakk bufferen inn i et PrintStream objekt Skriv data til konsollen Konverter arrayet til en streng! Konsollutgang:
|
GO TO FULL VERSION