java.io.FileOutputStream Eksempel
I dette eksempel skal vi tale om FileOutputStream
. FileOutputStream
er en underklasse af OutputStream
, som bruges til at overføre data fra dit program til en ressource. Og i dette tilfælde til en fil, der ligger i dit underliggende filsystem.
OK, så lad os starte med nogle simple eksempler.
1. Skrivning af bytes til en fil
Lad os se, hvordan du kan få en FileOutputStream
og skriv bytes til en fil.
FileOutputStreamExample.java:
package com.javacodegeeks.core.io.outputstream; import java.io.FileOutputStream; import java.io.IOException; public class FileOutputStreamExample { private static final String OUTPUT_FILE = "C:\\Users\\nikos\\Desktop\\TestFiles\\testFile.txt"; public static void main(String[] args) { String content = "Hello Java Code Geeks"; byte[] bytes = content.getBytes(); try (FileOutputStream out = new FileOutputStream(OUTPUT_FILE)) { // write a byte sequence out.write(bytes); // write a single byte out.write(bytes[0]); // write sub sequence of the byte array out.write(bytes,4,10); } catch (IOException e) { e.printStackTrace(); } } }
Dette er de grundlæggende tre API-metoder, der kan skrive bytes til en filressource ved hjælp af FileOutputStream:
void write(byte[] b)
. Skriv alle bytes af byte array b i destinationsressourcen.void write(byte[] b, int off, int len)
. Skriv en undersekvens af byte-arrayet.void write(int b)
. Skriv en enkelt byte.
Alle disse metoder skriver en sekvens af bytes i destinationsfilen (eller en enkelt byte). Hvis en af disse metoder vender tilbage med succes, så er du i stand til at læse de bytes, du har skrevet, fra den fil. Det er ikke garanteret, at bytes vil blive bevaret i den fysiske enhed, som dit filsystem kører på. Tværtimod vil de i de fleste tilfælde blive skrevet i en systembuffer. Det er operativsystemets og hardwarens ansvar, hvornår og hvordan man skriver disse bytes i den psykiske enhed. Selvfølgelig sker alle disse af præstationsmæssige årsager.
2. Buffering af en FileOutputStream
Når du udvikler en meget I/O-intensiv applikation, der skal skrive en stor sekvens af bytes i store filer, så anbefales det stærkt, at du bruger noget buffering. Den grundlæggende idé med buffering er, at du vil bruge en intern, mellembuffer til at tilføje dine bytes. Dette betyder, at systemet ikke skal kalde det underliggende OS's "skrive"-metode for hver enkelt byte, men i stedet operere i denne sekvens af byte. Dette kan gøre en stor forskel i præstationsfølsomme applikationer, da det reducerer mængden af dyre I/O-operationer.
For at gøre dette tilbyder Java en indpakningsklasse, BufferedOutputStream
. Lad os se, hvordan du kan bruge det.
FileOutputStreamExample.java:
package com.javacodegeeks.core.io.outputstream; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class FileOutputStreamExample { private static final String OUTPUT_FILE = "C:\\Users\\nikos\\Desktop\\TestFiles\\testFile.txt"; public static void main(String[] args) { String content = "Hello Java Code Geeks"; byte[] bytes = content.getBytes(); try (BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(OUTPUT_FILE),1024)) { // write a byte sequence out.write(bytes); // write a single byte out.write(bytes[0]); // write sub sequence of the byte array out.write(bytes,4,10); } catch (IOException e) { e.printStackTrace(); } } }
Som du kan se, er der ikke meget, der er anderledes. Bemærk, at jeg kan vælge størrelsen på den førnævnte interne buffer, i dette tilfælde 1024 bytes. Hvis du ikke angiver det andet argument til BufferedOutputStream
konstruktør, vil standardbufferen på 512 bytes blive brugt (hvilket er tilstrækkeligt i de fleste tilfælde).
OutputStream
tilbyder også en flush()
metode. Hvad dette gør, er at tvinge alle bufferede outputbytes til at blive skrevet ud til målressourcen. I vores tilfælde er denne ressource en fil. Igen, når disse bufferbytes tømmes, betyder ti ikke nødvendigvis, at de bliver skrevet på den fysiske disk.
FileOutputStreamExample.java:
package com.javacodegeeks.core.io.outputstream; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class FileOutputStreamExample { private static final String OUTPUT_FILE = "C:\\Users\\nikos\\Desktop\\TestFiles\\testFile.txt"; public static void main(String[] args) { String content = "Hello Java Code Geeks"; byte[] bytes = content.getBytes(); try (OutputStream out = new BufferedOutputStream(new FileOutputStream(OUTPUT_FILE),1024)) { // write a byte sequence out.write(bytes); // write a single byte out.write(bytes[0]); // write sub sequence of the byte array out.write(bytes,4,10); // flush the outputstream out.flush(); } catch (IOException e) { e.printStackTrace(); } } }
3. Skrive tegn til en fil
Når man har at gøre med binære filer, er det nok at skrive bytes. Men meget ofte skal du skrive tekstfiler fra dit program. For at skrive tegn direkte til din outputfil, som nu skal betragtes som en tekstfil, kan du ombryde FileOutputStream
omkring en OutputStreamWriter
. Ved at bruge dette kan du direkte skrive tegn eller strenge uden at skulle hente en byte-array ud af dem. Du kan også angive det tegnsæt, du ønsker, at dine tegn skal kodes til, ellers vil standarden blive brugt.
FileOutputStreamExample.java:
package com.javacodegeeks.core.io.outputstream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; public class FileOutputStreamExample { private static final String OUTPUT_FILE = "C:\\Users\\nikos\\Desktop\\TestFiles\\testFile.txt"; public static void main(String[] args) { String content = "Hello Java Code Geeks"; char[] chars = content.toCharArray(); try (OutputStreamWriter outWriter = new OutputStreamWriter(new FileOutputStream(OUTPUT_FILE),"utf-8")) { // write the whole string outWriter.write(content); // write a substring of the original string outWriter.write(content,5,11); // write a character sequence outWriter.write(chars); // write a single character outWriter.write(chars[0]); // write sub sequence of the character array outWriter.write(chars,4,10); } catch (IOException e) { e.printStackTrace(); } } }
Og selvfølgelig er der en bufferversion af OutputStreamWriter
, med navnet BufferedWriter
. Lad os se, hvordan du kan bruge det:
FileOutputStreamExample.java:
package com.javacodegeeks.core.io.outputstream; import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; public class FileOutputStreamExample { private static final String OUTPUT_FILE = "C:\\Users\\nikos\\Desktop\\TestFiles\\testFile.txt"; public static void main(String[] args) { String content = "Hello Java Code Geeks"; char[] chars = content.toCharArray(); try (BufferedWriter outWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(OUTPUT_FILE),"utf-8"),1024)) { // write the whole string outWriter.write(content); // change line outWriter.newLine(); // write a substring of the original string outWriter.write(content,5,11); outWriter.newLine(); // write a character sequence outWriter.write(chars); outWriter.newLine(); // write a single character outWriter.write(chars[0]); outWriter.newLine(); // write sub sequence of the character array outWriter.write(chars, 4, 10); } catch (IOException e) { e.printStackTrace(); } } }
En anden praktisk klasse, når du arbejder med tegnstrømme, er PrintWriter
klasse. Det tilbyder flere metoder såsom println
, print
og printf
for at tilpasse karakterstrømmens output, som du ønsker.
FileOutputStreamExample.java:
package com.javacodegeeks.core.io.outputstream; import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; public class FileOutputStreamExample { private static final String OUTPUT_FILE = "C:\\Users\\nikos\\Desktop\\TestFiles\\testFile.txt"; public static void main(String[] args) { String content = "Hello Java Code Geeks"; char[] chars = content.toCharArray(); try (PrintWriter outWriter = new PrintWriter( new BufferedWriter(new OutputStreamWriter(new FileOutputStream(OUTPUT_FILE))))) { // Write the string outWriter.print(content); // Write the string and change line outWriter.println(content); // Format the output outWriter.printf("%s\n",content); } catch (IOException e) { e.printStackTrace(); } } }
her er også en mere bekvem måde at oprette en PrintWriter til en fil, hvis du absolut skal:
FileOutputStreamExample.java:
package com.javacodegeeks.core.io.outputstream; import java.io.IOException; import java.io.PrintStream; import java.io.PrintWriter; public class FileOutputStreamExample { private static final String OUTPUT_FILE = "C:\\Users\\nikos\\Desktop\\TestFiles\\testFile.txt"; public static void main(String[] args) { String content = "Hello Java Code Geeks"; char[] chars = content.toCharArray(); try (PrintWriter outWriter = new PrintWriter( new PrintStream(OUTPUT_FILE))) { // Write the string outWriter.print(content); // Write the string and change line outWriter.println(content); // Format the output outWriter.printf("%s\n", content); } catch (IOException e) { e.printStackTrace(); } } }
Jeg ville foretrække den førstnævnte metode, da den bruger buffering.
4. Få en OutputStream ved hjælp af NIO
Du kan bruge Files
NIO-klasse for at opnå en OutputStream
til en fil.
FileOutputStreamExample.java:
package com.javacodegeeks.core.io.outputstream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class FileOutputStreamExample { private static final String OUTPUT_FILE = "C:\\Users\\nikos\\Desktop\\TestFiles\\testFile.txt"; public static void main(String[] args) { String content = "Hello Java Code Geeks"; byte[] bytes = content.getBytes(); Path filepath = Paths.get(OUTPUT_FILE); try ( OutputStream out = Files.newOutputStream(filepath)) { out.write(bytes); } catch (IOException e) { e.printStackTrace(); } } }
Download kildekode
Dette var et eksempel på java.io.FileOutputStream. Download koden til dette eksempel her: FileOutputStreamExample.zipbufferedoutputstream BufferedWriter OutputStream OutputStreamWriter PrintWriter