1. OutputStream
klasse
Vi har for nylig udforsket input-streams. Det er tid til at tale om outputstrømme.
Klassen OutputStream
er den overordnede klasse for alle klasser, der understøtter byte-output. Dette er en abstrakt klasse, der ikke gør noget alene, men den har efterkommerklasser til enhver lejlighed.
Det lyder ekstremt kompliceret. For at sige det mere enkelt, så opererer denne klasse på bytes, og ikke for eksempel tegn eller andre datatyper. Og det faktum, at det er abstrakt, betyder, at vi normalt ikke bruger det, men derimod en af dets efterkommerklasser. For eksempel FileOutputStream
og lignende.
Men tilbage til OutputStream
klassen. Denne klasse har metoder, som alle dens efterkommerklasser skal implementere. Her er de vigtigste:
Metoder | Beskrivelse |
---|---|
|
Skriver en byte (ikke en int ) til strømmen. |
|
Skriver et array af bytes til strømmen |
|
Skriver en del af et array af bytes til strømmen |
|
Skriver alle data gemt i bufferen til streamen |
|
Lukker strømmen |
Når du opretter et objekt af en klasse, der arver InputStream
, angiver du normalt et kildeobjekt, som InputStream
læser data fra. Når du opretter et objekt af en klasse, der arver OutputStream
, angiver du normalt også det målobjekt eller den strøm, som data vil blive skrevet til.
Lad os kort gennemgå alle klassens metoder OutputStream
:
write(int b)
metode
Denne metode skriver en byte (ikke en int
) til outputstrømmen. Den beståede værdi castes til en byte, og int'ens første tre bytes kasseres.
write(byte[] buffer)
metode
Skriver det givne array af bytes til outputstrømmen. Det er det.
write(byte[] buffer, int offset, int length)
metode
Skriver en del af det overførte array af bytes til outputstrømmen. Forskydningsvariablen angiver indekset for det første element i arrayet og length
er længden af den delmængde, der skal skrives.
flush()
metode
Metoden flush()
bruges til at tvinge alle data, der potentielt er bufferet i den aktuelle strøm, til at blive skrevet til målstrømmen. Dette er relevant, når der bruges buffering og/eller flere stream-objekter arrangeret i en kæde.
close()
metode
Skriver alle uskrevne data til målobjektet. Metoden close()
behøver ikke kaldes, hvis du bruger en try-with-resources
blok.
Eksempel på kopiering af en fil
Kode | Bemærk |
---|---|
|
InputStream til læsning fra en fil OutputStream til skrivning til en fil Buffer, hvori vi vil læse dataene Så længe der er data i strømmen Læs data ind i bufferen Skriv dataene fra bufferen til den anden strøm |
2. Writer
klasse
Klassen Writer
er nøjagtig den samme som OutputStream
klassen, men kun én forskel igen: den fungerer med tegn ( char
) i stedet for bytes.
Dette er en abstrakt klasse: du kan ikke oprette objekter i Writer
klassen. Dens hovedmål er at være en fælles forældreklasse for hundredvis af efterkommerklasser og at give dem fælles metoder til at arbejde med karakterstrømme.
Klassens metoder Writer
(og alle dens efterkommerklasser):
Metoder | Beskrivelse |
---|---|
|
Skriver et tegn (ikke et int ) til strømmen. |
|
Skriver en række tegn til strømmen |
|
Skriver en del af en række tegn til strømmen |
|
Skriver en streng til strømmen |
|
Skriver en del af en streng til strømmen |
|
Skriver alle data gemt i bufferen til streamen |
|
Lukker strømmen |
Metoderne minder meget om klassens metoder OutputStream
, men de arbejder med tegn i stedet for bytes.
Beskrivelse af metoder:
write(int b)
metode
Denne metode skriver et enkelt tegn ( char
— ikke et int
) til outputstrømmen. Den beståede værdi castes til a char
, og de første to bytes kasseres.
write(char[] buffer)
metode
Skriver den givne række af tegn til outputstrømmen.
write(char[] buffer, int offset, int length)
metode
Skriver en del af det beståede array af tegn til outputstrømmen. Variablen offset
angiver indekset for det første element i arrayet og length
er længden af den delmængde, der skal skrives.
write(String str)
metode
Skriver den givne streng til outputstrømmen.
write(String str, int offset, int length)
metode
Skriver en del af den givne streng til outputstrømmen: strengen konverteres til et array af tegn. Variablen offset
angiver indekset for det første element i arrayet og length
er længden af den delmængde, der skal skrives.
flush()
metode
Metoden flush()
bruges til at tvinge alle data, der potentielt er bufferet i den aktuelle strøm, til at blive skrevet til målstrømmen. Dette er relevant, når der bruges buffering og/eller flere stream-objekter arrangeret i en kæde.
close()
metode
Skriver alle uskrevne data til målobjektet. Metoden close()
behøver ikke kaldes, hvis du bruger en try-with-resources
blok.
Eksempel på et program, der kopierer en tekstfil:
Kode | Bemærk |
---|---|
|
Reader til læsning fra en fil Writer til skrivning til en fil Buffer, hvori vi vil læse dataene Så længe der er data i strømmen Læs data ind i en buffer Skriv dataene fra bufferen til den anden strøm |
StringWriter
klasse
Der er en anden interessant klasse, der arver Writer
klassen: den hedder StringWriter
. Den indeholder en foranderlig streng - et StringBuffer
objekt. Og hver gang du "skriver" noget til objektet StringWriter
, tilføjes teksten simpelthen til dens interne buffer.
Eksempel:
Kode | Bemærk |
---|---|
|
En måltegnstrøm ( StringWriter ) oprettes En streng skrives til bufferen inde i StringWriter en streng skrives til bufferen inde i StringWriter Konvertering af indholdet af et objekt til en streng |
I dette tilfælde StringWriter
er klassen i det væsentlige en indpakning over StringBuffer
klassen, men StringWriter
klassen er en efterkommer af Writer
stream-klassen, og den kan bruges i kæder af stream-objekter. Dette er en ret nyttig egenskab i praksis.
3. PrintStream
klasse
Outputstrømsklasser kan også sættes i en kæde med mellemliggende strømme, der skriver data til målstrømmen, der sendes til dem. Det generelle billede af interaktionen mellem disse strømme ser sådan ud:
Den mest interessante og alsidige af alle mellemliggende outputstrømme er PrintStream
. Den har snesevis af metoder og så mange som 12 konstruktører.
Klassen PrintStream
arver FilterOutputStream
klassen, som arver OutputStream
. Det betyder, at PrintStream
klassen har alle de overordnede klassers metoder foruden sine egne metoder . Her er de mest interessante:
Metoder | Beskrivelse |
---|---|
|
Konverterer det beståede objekt til en streng og sender det til målstrømmen. |
|
Konverterer det beståede objekt til en streng og sender det til målstrømmen. Tilføjer et linjeskift i slutningen |
|
Udsender et linjeskifttegn til målstrømmen |
|
Konstruerer og udlæser en streng baseret på formatstrengen og de beståede argumenter; svarende til String.format() metoden |
Og hvor er disse snesevis af metoder, spørger du?
Nå, det har mange varianter af print()
og println()
metoder med forskellige parametre. De kan opsummeres i denne tabel.
Vi vil ikke dykke ned i disse metoder, fordi du allerede kender dem godt. Kan du gætte, hvad jeg går efter?
Husk System.out.println()
? Men det kan skrives på to linjer:
Kode | Konsoludgang |
---|---|
|
|
Vores foretrukne kommando er et kald til metoden på den statiske variabel i klassen. Og denne variabels type er .System.out.println()
println()
out
System
PrintStream
På mange CodeGym-niveauer og i næsten alle opgaver har du kaldt klassens metoder PrintStream
uden at vide det!
Praktisk brug
Java har denne interessante klasse kaldet ByteArrayOutputStream
, som er en dynamisk voksende byte-array, der arver OutputStream
.
Et ByteArrayOutputStream
objekt og PrintStream
objekt kan kædes sammen på denne måde:
Kode | Beskrivelse |
---|---|
|
Opret en skrivebuffer i hukommelsen Pak bufferen ind i et PrintStream objekt Skriv data til konsollen Konverter arrayet til en streng! Konsoludgang:
|
GO TO FULL VERSION