Java >> Java tutorial >  >> Tag >> java.io

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

Java tag