1. OutputStreamklasse

Vi har for nylig udforsket input-streams. Det er tid til at tale om outputstrømme.

Klassen OutputStreamer 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 FileOutputStreamog lignende.

Men tilbage til OutputStreamklassen. Denne klasse har metoder, som alle dens efterkommerklasser skal implementere. Her er de vigtigste:

Metoder Beskrivelse
void write(int b)
Skriver en byte (ikke en int) til strømmen.
void write(byte[] buffer)
Skriver et array af bytes til strømmen
void write(byte[] buffer, off, len)
Skriver en del af et array af bytes til strømmen
void flush()
Skriver alle data gemt i bufferen til streamen
void close()
Lukker strømmen

Når du opretter et objekt af en klasse, der arver InputStream, angiver du normalt et kildeobjekt, som InputStreamlæ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 lengther 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-resourcesblok.

Eksempel på kopiering af en fil

Kode Bemærk
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileInputStream input = new FileInputStream(src);
FileOutputStream output = new FileOutputStream(dest))
{
   byte[] buffer = new byte[65536]; // 64Kb
   while (input.available() > 0)
   {
      int real = input.read(buffer);
      output.write(buffer, 0, real);
   }
}



InputStreamtil læsning fra en fil
OutputStreamtil 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. Writerklasse

Klassen Writerer nøjagtig den samme som OutputStreamklassen, 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 Writerklassen. 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
void write(int b)
Skriver et tegn (ikke et int) til strømmen.
void write(char[] buffer)
Skriver en række tegn til strømmen
void write(char[] buffer, off, len)
Skriver en del af en række tegn til strømmen
void write(String str)
Skriver en streng til strømmen
void write(String str, off, len)
Skriver en del af en streng til strømmen
void flush()
Skriver alle data gemt i bufferen til streamen
void close()
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 offsetangiver indekset for det første element i arrayet og lengther 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 offsetangiver indekset for det første element i arrayet og lengther 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-resourcesblok.

Eksempel på et program, der kopierer en tekstfil:

Kode Bemærk
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileReader reader = new FileReader(src);
FileWriter writer = new FileWriter(dest))
{
   char[] buffer = new char[65536]; // 128Kb
   while (reader.ready())
   {
      int real = reader.read(buffer);
      writer.write(buffer, 0, real);
   }
}



Readertil læsning fra en fil
Writertil 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

StringWriterklasse

Der er en anden interessant klasse, der arver Writerklassen: den hedder StringWriter. Den indeholder en foranderlig streng - et StringBufferobjekt. Og hver gang du "skriver" noget til objektet StringWriter, tilføjes teksten simpelthen til dens interne buffer.

Eksempel:

Kode Bemærk
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.write(String.valueOf(123));

String result = writer.toString();
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 StringWriterer klassen i det væsentlige en indpakning over StringBufferklassen, men StringWriterklassen er en efterkommer af Writerstream-klassen, og den kan bruges i kæder af stream-objekter. Dette er en ret nyttig egenskab i praksis.



3. PrintStreamklasse

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:

PrintStream klasse

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 PrintStreamarver FilterOutputStreamklassen, som arver OutputStream. Det betyder, at PrintStreamklassen har alle de overordnede klassers metoder foruden sine egne metoder . Her er de mest interessante:

Metoder Beskrivelse
void print(obj)
Konverterer det beståede objekt til en streng og sender det til målstrømmen.
void println(obj)
Konverterer det beståede objekt til en streng og sender det til målstrømmen. Tilføjer et linjeskift i slutningen
void println()
Udsender et linjeskifttegn til målstrømmen
PrintStream format(String format, args...)
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
PrintStream stream = System.out;
stream.println("Hello!");
Hello!

Vores foretrukne kommando er et kald til metoden på den statiske variabel i klassen. Og denne variabels type er .System.out.println()println()outSystemPrintStream

På mange CodeGym-niveauer og i næsten alle opgaver har du kaldt klassens metoder PrintStreamuden at vide det!

Praktisk brug

Java har denne interessante klasse kaldet ByteArrayOutputStream, som er en dynamisk voksende byte-array, der arver OutputStream.

Et ByteArrayOutputStreamobjekt og PrintStreamobjekt kan kædes sammen på denne måde:

Kode Beskrivelse
ByteArrayOutputStream baos = new ByteArrayOutputStream();

try(PrintStream stream = new PrintStream(baos))
{
   stream.println("Hello");
   stream.println(123);
}

String result = baos.toString();

System.out.println(result);
Opret en skrivebuffer i hukommelsen

Pak bufferen ind i et PrintStreamobjekt

Skriv data til konsollen



Konverter arrayet til en streng!

Konsoludgang:
Hello!
123