1. OutputStreamklasse

Vi har for nylig udforsket inputstrømme. 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 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.