1. OutputStreamklasse

Vi har nylig utforsket inndatastrømmer. Det er på tide å snakke om utgangsstrømmer.

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

Men tilbake til OutputStreamklassen. Denne klassen har metoder som alle dens etterkommerklasser må implementere. Her er de viktigste:

Metoder Beskrivelse
void write(int b)
Skriver én byte (ikke en int) til strømmen.
void write(byte[] buffer)
Skriver en rekke byte til strømmen
void write(byte[] buffer, off, len)
Skriver en del av en rekke byte til strømmen
void flush()
Skriver alle data som er lagret i bufferen til strømmen
void close()
Lukker strømmen

Når du oppretter et objekt av en klasse som arver InputStream, spesifiserer du vanligvis et kildeobjekt som InputStreamleser 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 lengther 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-resourcesblokk.

Eksempel på kopiering av en fil

Kode Merk
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);
   }
}



InputStreamfor å lese fra en fil
OutputStreamfor å 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. Writerklasse

Klassen Writerer nøyaktig den samme som OutputStreamklassen, 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 Writerklassen. Hovedmålet er å være en felles foreldreklasse for hundrevis av etterkommerklasser og å gi dem vanlige metoder for å jobbe med karakterstrømmer.

Metoder for Writerklassen (og alle dens etterkommerklasser):

Metoder Beskrivelse
void write(int b)
Skriver ett tegn (ikke et int) til strømmen.
void write(char[] buffer)
Skriver en rekke tegn til strømmen
void write(char[] buffer, off, len)
Skriver en del av en rekke tegn til strømmen
void write(String str)
Skriver en streng til strømmen
void write(String str, off, len)
Skriver en del av en streng til strømmen
void flush()
Skriver alle data som er lagret i bufferen til strømmen
void close()
Lukker strømmen

Metodene ligner veldig på metodene i OutputStreamklassen, 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 offsetindikerer indeksen til det første elementet i matrisen, og lengther 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 offsetindikerer indeksen til det første elementet i matrisen, og lengther 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-resourcesblokk.

Eksempel på et program som kopierer en tekstfil:

Kode Merk
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);
   }
}



Readerfor å lese fra en fil
Writerfor å 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

StringWriterklasse

Det er en annen interessant klasse som arver Writerklassen: den heter StringWriter. Den inneholder en foranderlig streng - et StringBufferobjekt. Og hver gang du "skriver" noe til objektet StringWriter, blir teksten ganske enkelt lagt til den interne bufferen.

Eksempel:

Kode Merk
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.write(String.valueOf(123));

String result = writer.toString();
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 StringWriterer klassen i hovedsak en innpakning over StringBufferklassen, men StringWriterklassen er en etterkommer av Writerstrømklassen, og den kan brukes i kjeder av strømobjekter. Dette er en ganske nyttig egenskap i praksis.