1. OutputStream
klass
Vi har nyligen utforskat indataströmmar. Det är dags att prata om utgångsströmmar.
Klassen OutputStream
är den överordnade klassen för alla klasser som stöder byte-utdata. Det här är en abstrakt klass som inte gör något på egen hand, men den har efterkommande klasser för varje tillfälle.
Det låter extremt komplicerat. För att uttrycka det enklare, den här klassen fungerar på bytes, och inte till exempel tecken eller andra datatyper. Och det faktum att det är abstrakt betyder att vi vanligtvis inte använder det, utan snarare en av dess efterkommande klasser. Till exempel FileOutputStream
och liknande.
Men tillbaka till OutputStream
klassen. Den här klassen har metoder som alla dess underliggande klasser måste implementera. Här är de viktigaste:
Metoder | Beskrivning |
---|---|
|
Skriver en byte (inte en int ) till strömmen. |
|
Skriver en array av byte till strömmen |
|
Skriver en del av en array av byte till strömmen |
|
Skriver all data lagrad i bufferten till strömmen |
|
Stänger strömmen |
När du skapar ett objekt av en klass som ärver InputStream
anger du vanligtvis ett källobjekt som InputStream
läser data från. När du skapar ett objekt av en klass som ärver OutputStream
anger du vanligtvis också målobjektet eller strömmen som data ska skrivas till.
Låt oss kort gå igenom klassens alla metoder OutputStream
:
write(int b)
metod
Denna metod skriver en byte (inte en int
) till utgångsströmmen. Det godkända värdet castas till en byte, och int:s första tre byte kasseras.
write(byte[] buffer)
metod
Skriver den givna arrayen av byte till utgångsströmmen. Det är allt.
write(byte[] buffer, int offset, int length)
metod
Skriver en del av den passerade arrayen av byte till utgångsströmmen. Offsetvariabeln indikerar indexet för det första elementet i matrisen och length
är längden på delmängden som ska skrivas.
flush()
metod
Metoden flush()
används för att tvinga all data som potentiellt är buffrad i den aktuella strömmen att skrivas till målströmmen. Detta är relevant när man använder buffring och/eller flera strömobjekt arrangerade i en kedja.
close()
metod
Skriver all oskriven data till målobjektet. Metoden close()
behöver inte anropas om du använder ett try-with-resources
block.
Exempel på kopiering av en fil
Koda | Notera |
---|---|
|
InputStream för att läsa från en fil OutputStream för att skriva till en fil Buffert som vi kommer att läsa in data i Så länge det finns data i strömmen Läs data i bufferten Skriv data från bufferten till den andra strömmen |
2. Writer
klass
Klassen Writer
är exakt samma som OutputStream
klassen, men bara en skillnad igen: den fungerar med tecken ( char
) istället för byte.
Det här är en abstrakt klass: du kan inte skapa objekt i Writer
klassen. Dess huvudsakliga mål är att vara en gemensam föräldraklass för hundratals efterkommande klasser och att ge dem gemensamma metoder för att arbeta med karaktärsströmmar.
Metoder för Writer
klassen (och alla dess underliggande klasser):
Metoder | Beskrivning |
---|---|
|
Skriver ett tecken (inte ett int ) till strömmen. |
|
Skriver en rad tecken till strömmen |
|
Skriver en del av en uppsättning tecken till strömmen |
|
Skriver en sträng till strömmen |
|
Skriver en del av en sträng till strömmen |
|
Skriver all data lagrad i bufferten till strömmen |
|
Stänger strömmen |
Metoderna är väldigt lika metoderna i klassen, OutputStream
men de fungerar med tecken istället för byte.
Beskrivning av metoder:
write(int b)
metod
Denna metod skriver ett enstaka tecken ( char
— inte ett int
) till utmatningsströmmen. Det godkända värdet kastas till a char
och de första två byten kasseras.
write(char[] buffer)
metod
Skriver den givna uppsättningen av tecken till utdataströmmen.
write(char[] buffer, int offset, int length)
metod
Skriver en del av den passerade arrayen av tecken till utdataströmmen. Variabeln offset
indikerar indexet för det första elementet i arrayen och length
är längden på delmängden som ska skrivas.
write(String str)
metod
Skriver den givna strängen till utgångsströmmen.
write(String str, int offset, int length)
metod
Skriver en del av den givna strängen till utdataströmmen: strängen konverteras till en array av tecken. Variabeln offset
indikerar indexet för det första elementet i arrayen och length
är längden på delmängden som ska skrivas.
flush()
metod
Metoden flush()
används för att tvinga all data som potentiellt är buffrad i den aktuella strömmen att skrivas till målströmmen. Detta är relevant när man använder buffring och/eller flera strömobjekt arrangerade i en kedja.
close()
metod
Skriver all oskriven data till målobjektet. Metoden close()
behöver inte anropas om du använder ett try-with-resources
block.
Exempel på ett program som kopierar en textfil:
Koda | Notera |
---|---|
|
Reader för att läsa från en fil Writer för att skriva till en fil Buffert som vi kommer att läsa in data i Så länge det finns data i strömmen Läs data i en buffert Skriv data från bufferten till den andra strömmen |
StringWriter
klass
Det finns en annan intressant klass som ärver Writer
klassen: den heter StringWriter
. Den innehåller en föränderlig sträng — ett StringBuffer
objekt. Och varje gång du "skriver" något till objektet StringWriter
läggs texten helt enkelt till i dess interna buffert.
Exempel:
Koda | Notera |
---|---|
|
En målteckenström ( StringWriter ) skapas En sträng skrivs till bufferten inuti StringWriter En sträng skrivs till bufferten inuti StringWriter Konvertera innehållet i ett objekt till en sträng |
I det här fallet StringWriter
är klassen i huvudsak ett omslag över StringBuffer
klassen, men StringWriter
klassen är en ättling till Writer
strömklassen och den kan användas i kedjor av strömobjekt. Detta är en ganska användbar egenskap i praktiken.
3. PrintStream
klass
Utdataströmsklasser kan också läggas in i en kedja med mellanliggande strömmar som skriver data till målströmmen som skickas till dem. Den allmänna synen på interaktionen mellan dessa strömmar ser ut så här:
Den mest intressanta och mångsidiga av alla mellanliggande utdataströmmar är PrintStream
. Den har tiotals metoder och så många som 12 konstruktörer.
Klassen PrintStream
ärver FilterOutputStream
klassen, som ärver OutputStream
. Det betyder att PrintStream
klassen har alla metoder för de överordnade klasserna förutom sina egna metoder . Här är de mest intressanta:
Metoder | Beskrivning |
---|---|
|
Konverterar det skickade objektet till en sträng och matar ut det till målströmmen. |
|
Konverterar det skickade objektet till en sträng och matar ut det till målströmmen. Lägger till en radbrytning i slutet |
|
Matar ut ett radbrytningstecken till målströmmen |
|
Konstruerar och matar ut en sträng baserat på formatsträngen och de godkända argumenten; liknande String.format() metoden |
Och var är dessa tiotals metoder, frågar du dig?
Tja, den har många varianter av print()
och println()
metoder med olika parametrar. De kan sammanfattas i denna tabell.
Vi kommer inte att fördjupa oss i dessa metoder, eftersom du redan känner till dem väl. Kan du gissa vad jag menar?
Kommer du ihåg System.out.println()
? Men det kan skrivas på två rader:
Koda | Konsolutgång |
---|---|
|
|
Vårt favoritkommando är ett anrop till metoden på klassens statiska variabel . Och denna variabels typ är .System.out.println()
println()
out
System
PrintStream
På många CodeGym-nivåer, och i nästan varje uppgift, har du anropat klassens metoder PrintStream
utan att ens veta om det!
Praktisk användning
Java har denna intressanta klass som heter ByteArrayOutputStream
, som är en dynamiskt växande byte-array som ärver OutputStream
.
Ett ByteArrayOutputStream
objekt och PrintStream
objekt kan kedjas ihop så här:
Koda | Beskrivning |
---|---|
|
Skapa en skrivbuffert i minnet Slå in bufferten i ett PrintStream objekt Skriv data till konsolen Konvertera arrayen till en sträng! Konsolutgång:
|
GO TO FULL VERSION