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.



3. PrintStreamklasse

Utgangsstrømklasser kan også settes inn i en kjede med mellomstrømmer som skriver data til målstrømmen som sendes til dem. Det generelle synet på samspillet mellom disse strømmene ser slik ut:

PrintStream-klassen

Den mest interessante og allsidige av alle mellomliggende utdatastrømmer er PrintStream. Den har titalls metoder og så mange som 12 konstruktører.

Klassen PrintStreamarver FilterOutputStreamklassen, som arver OutputStream. Det betyr at PrintStreamklassen har alle metodene til foreldreklassene i tillegg til sine egne metoder . Her er de mest interessante:

Metoder Beskrivelse
void print(obj)
Konverterer det beståtte objektet til en streng og sender det ut til målstrømmen.
void println(obj)
Konverterer det beståtte objektet til en streng og sender det ut til målstrømmen. Legger til et linjeskift på slutten
void println()
Sender ut et linjeskifttegn til målstrømmen
PrintStream format(String format, args...)
Konstruerer og sender ut en streng basert på formatstrengen og de beståtte argumentene; lik String.format()metoden

Og hvor er disse titalls metodene, spør du?

Vel, den har mange varianter av print()og println()metoder med forskjellige parametere. De kan oppsummeres i denne tabellen.

Vi vil ikke dykke ned i disse metodene, fordi du allerede kjenner dem godt. Kan du gjette hva jeg vil til?

Husker du System.out.println()? Men det kan skrives på to linjer:

Kode Konsollutgang
PrintStream stream = System.out;
stream.println("Hello!");
Hello!

Vår favorittkommando er et kall til metoden på den statiske variabelen til klassen. Og denne variabelens type er .System.out.println()println()outSystemPrintStream

På mange CodeGym-nivåer, og i nesten alle oppgaver, har du kalt klassens metoder PrintStreamuten å vite det!

Praktisk bruk

Java har denne interessante klassen kalt ByteArrayOutputStream, som er en dynamisk voksende byte-array som arver OutputStream.

Et ByteArrayOutputStreamobjekt og PrintStreamobjekt kan lenkes slik:

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);
Lag en skrivebuffer i minnet

Pakk bufferen inn i et PrintStreamobjekt

Skriv data til konsollen



Konverter arrayet til en streng!

Konsollutgang:
Hello!
123