Java - Skriv til fil

1. Oversigt

I denne vejledning vi undersøger forskellige måder at skrive til en fil ved hjælp af Java. Vi bruger BufferedWriter, PrintWriter, FileOutputStream, DataOutputStream, RandomAccessFile, FileChannel, og Java 7 Filer utility klasse.

Vi vil også se på at låse filen under skrivning og diskutere nogle sidste takeaways ved at skrive til filen.

Denne vejledning er en del af Java "Back to Basics" -serien her på Baeldung.

2. Skriv med BufferedWriter

Lad os starte simpelt og brug BufferedWriter at skrive en Snor til en ny fil:

offentlig ugyldig nårWriteStringUsingBufferedWritter_thenCorrect () kaster IOException {String str = "Hej"; BufferedWriter-forfatter = ny BufferedWriter (ny FileWriter (filnavn)); writer.write (str); writer.close (); }

Outputtet i filen vil være:

Hej

Det kan vi så tilføje en Snor til den eksisterende fil:

@Test offentlig ugyldig nårAppendStringUsingBufferedWritter_thenOldContentShouldExistToo () kaster IOException {String str = "World"; BufferedWriter-forfatter = ny BufferedWriter (ny FileWriter (filnavn, sand)); writer.append (''); author.append (str); writer.close (); }

Filen vil så være:

Hej Verden

3. Skriv med PrintWriter

Lad os derefter se hvordan vi kan bruge PrintWriter at skrive formateret tekst til en fil:

@Test offentlig ugyldighed givenWritingStringToFile_whenUsingPrintWriter_thenCorrect () kaster IOException {FileWriter fileWriter = ny FileWriter (filnavn); PrintWriter printWriter = ny PrintWriter (fileWriter); printWriter.print ("Nogle strenge"); printWriter.printf ("Produktnavn er% s og prisen er% d $", "iPhone", 1000); printWriter.close (); }

Den resulterende fil indeholder:

Noget strengproduktnavn er iPhone, og prisen er 1000 $

Bemærk, hvordan vi ikke kun skriver en rå Snor til en fil, men også noget formateret tekst med printf metode.

Vi kan oprette forfatteren ved hjælp af FileWriter, BufferedWriter, eller endda System.out.

4. Skriv med FileOutputStream

Lad os nu se, hvordan vi kan bruge FileOutputStream til skriv binære data til en fil.

Den følgende kode konverterer a Snor i bytes og skriver bytes til en fil ved hjælp af FileOutputStream:

@Test offentlig ugyldighed givenWritingStringToFile_whenUsingFileOutputStream_thenCorrect () kaster IOException {String str = "Hej"; FileOutputStream outputStream = ny FileOutputStream (filnavn); byte [] strToBytes = str.getBytes (); outputStream.write (strToBytes); outputStream.close (); }

Outputtet i filen vil naturligvis være:

Hej

5. Skriv med DataOutputStream

Lad os derefter se på, hvordan vi kan bruge DataOutputStream at skrive en Snor til en fil:

@Test offentlig ugyldighed givenWritingToFile_whenUsingDataOutputStream_thenCorrect () kaster IOException {String value = "Hello"; FileOutputStream fos = ny FileOutputStream (filnavn); DataOutputStream outStream = ny DataOutputStream (ny BufferedOutputStream (fos)); outStream.writeUTF (værdi); outStream.close (); // verificer resultaterne Strengresultat; FileInputStream fis = ny FileInputStream (filnavn); DataInputStream-læser = ny DataInputStream (fis); resultat = reader.readUTF (); reader.close (); assertEquals (værdi, resultat); }

6. Skriv med RandomAccessFile

Lad os nu illustrere, hvordan man gør det skrive og redigere i en eksisterende fil snarere end bare at skrive til en helt ny fil eller tilføje til en eksisterende. Kort sagt: Vi har brug for tilfældig adgang.

RandomAccessFile gør det muligt for os at skrive på en bestemt position i filen givet forskydningen - fra begyndelsen af ​​filen - i bytes.

Denne kode skriver en heltalsværdi med offset givet fra begyndelsen af ​​filen:

privat ugyldigt writeToPosition (streng filnavn, int data, lang position) kaster IOException {RandomAccessFile forfatter = ny RandomAccessFile (filnavn, "rw"); writer.seek (stilling); writer.writeInt (data); writer.close (); }

Hvis vi vil Læs int gemt på et bestemt sted, kan vi bruge denne metode:

privat int readFromPosition (streng filnavn, lang position) kaster IOException {int resultat = 0; RandomAccessFile-læser = ny RandomAccessFile (filnavn, "r"); reader.seek (position); resultat = reader.readInt (); reader.close (); returresultat }

For at teste vores funktioner, lad os skrive et heltal, redigere det og endelig læse det tilbage:

@Test offentlig ugyldig når WritingToSpecificPositionInFile_thenCorrect () kaster IOException {int data1 = 2014; int data2 = 1500; skriv til position (filnavn, data1, 4); assertEquals (data1, readFromPosition (filnavn, 4)); skriv til position (filnavn2, data2, 4); assertEquals (data2, readFromPosition (filnavn, 4)); }

7. Skriv med FileChannel

Hvis vi har at gøre med store filer, FileChannel kan være hurtigere end standard IO. Følgende kode skriver Snor til en fil ved hjælp af FileChannel:

@Test offentlig ugyldighed givenWritingToFile_whenUsingFileChannel_thenCorrect () kaster IOException {RandomAccessFile stream = ny RandomAccessFile (filnavn, "rw"); FileChannel channel = stream.getChannel (); Strengværdi = "Hej"; byte [] strBytes = value.getBytes (); ByteBuffer buffer = ByteBuffer.allocate (strBytes.length); buffer.put (strBytes); buffer.flip (); channel.write (buffer); stream.close (); channel.close (); // verificer RandomAccessFile-læser = ny RandomAccessFile (filnavn, "r"); assertEquals (værdi, reader.readLine ()); reader.close (); }

8. Skriv med Filer Klasse

Java 7 introducerer en ny måde at arbejde med filsystemet sammen med en ny hjælpeklasse: Filer.

Bruger Filer klasse, kan vi oprette, flytte, kopiere og slette filer og mapper. Det kan også bruges til at læse og skrive til en fil:

@Test offentlig ugyldighed givenUsingJava7_whenWritingToFile_thenCorrect () kaster IOException {String str = "Hej"; Sti sti = Paths.get (filnavn); byte [] strToBytes = str.getBytes (); Files.write (sti, strToBytes); String read = Files.readAllLines (sti) .get (0); assertEquals (str, læs); }

9. Skriv til en midlertidig fil

Lad os nu prøve at skrive til en midlertidig fil. Den følgende kode opretter en midlertidig fil og skriver en Snor til det:

@Test offentlig ugyldig nårWriteToTmpFile_thenCorrect () kaster IOException {String toWrite = "Hej"; File tmpFile = File.createTempFile ("test", ".tmp"); FileWriter-forfatter = ny FileWriter (tmpFile); writer.write (toWrite); writer.close (); BufferedReader-læser = ny BufferedReader (ny FileReader (tmpFile)); assertEquals (toWrite, reader.readLine ()); reader.close (); }

Som vi kan se, er det bare oprettelsen af ​​den midlertidige fil, der er interessant og anderledes. Efter dette punkt er det samme at skrive til filen.

10. Lås fil, før du skriver

Endelig, når vi skriver til en fil, er vi undertiden nødt til at være ekstra sikre på, at ingen andre skriver til den fil på samme tid. Dybest set skal vi være i stand til at låse den fil, mens du skriver.

Lad os gøre brug af FileChannel for at prøve at låse filen, før du skriver til den:

@Test offentlig ugyldig når TryToLockFile_thenItShouldBeLocked () kaster IOException {RandomAccessFile stream = ny RandomAccessFile (filnavn, "rw"); FileChannel channel = stream.getChannel (); FileLock-lås = null; prøv {lock = channel.tryLock (); } fange (endelig OverlappingFileLockException e) {stream.close (); channel.close (); } stream.writeChars ("testlås"); lock.release (); stream.close (); channel.close (); }

Bemærk, at hvis filen allerede er låst, når vi prøver at anskaffe låsen, an OverlappingFileLockException vil blive kastet.

11. Noter

Efter at have undersøgt så mange metoder til at skrive til en fil, lad os diskutere nogle vigtige noter:

  • Hvis vi prøver at læse fra en fil, der ikke findes, a FileNotFoundException vil blive kastet.
  • Hvis vi prøver at skrive til en fil, der ikke findes, oprettes filen først, og der kastes ingen undtagelse.
  • Det er meget vigtigt at lukke strømmen efter brug af den, da den ikke er lukket implicit, for at frigive ressourcer, der er knyttet til den.
  • I output stream er tæt() metodeopkald Flush() inden frigivelse af ressourcerne, som tvinger eventuelle buffrede byte til at blive skrevet til strømmen.

Når man ser på de almindelige anvendelsesmetoder, kan vi for eksempel se det PrintWriter bruges til at skrive formateret tekst, FileOutputStream at skrive binære data, DataOutputStream at skrive primitive datatyper, RandomAccessFile at skrive til en bestemt position, og FileChannel at skrive hurtigere i større filer. Nogle af API'erne i disse klasser tillader mere, men det er et godt sted at starte.

12. Konklusion

Denne artikel illustrerede de mange muligheder for at skrive data til en fil ved hjælp af Java.

Implementeringen af ​​alle disse eksempler og kodestykker findes på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found