Java - zápis do súboru

1. Prehľad

V tomto návode preskúmame rôzne spôsoby zápisu do súboru pomocou Javy. Využijeme to BufferedWriter, PrintWriter, FileOutputStream, DataOutputStream, RandomAccessFile, FileChannel, a Java 7 Súbory úžitková trieda.

Počas písania sa tiež pozrieme na uzamknutie súboru a prediskutujeme niekoľko posledných krokov týkajúcich sa zápisu do súboru.

Tento výukový program je súčasťou série Java „Späť k základom“ tu na Baeldungu.

2. Píšte s BufferedWriter

Začnime jednoducho a použitie BufferedWriter napísať a String do nového súboru:

public void whenWriteStringUsingBufferedWritter_thenCorrect () vyvolá IOException {String str = "Hello"; Zapisovač BufferedWriter = nový BufferedWriter (nový FileWriter (názov súboru)); spisovateľ.písať (str); writer.close (); }

Výstup v súbore bude:

Ahoj

Môžeme potom pridať a String do existujúceho súboru:

@Test public void whenAppendStringUsingBufferedWritter_thenOldContentShouldExistToo () vyvolá IOException {String str = "World"; Zapisovač BufferedWriter = nový BufferedWriter (nový FileWriter (fileName, true)); writer.append (''); writer.append (str); writer.close (); }

Súbor potom bude:

Ahoj svet

3. Píšte s PrintWriter

Ďalej sa pozrime ako môžeme použiť PrintWriter písať formátovaný text do súboru:

@ Test public void givenWritingStringToFile_whenUsingPrintWriter_thenCorrect () vyvolá IOException {FileWriter fileWriter = nový FileWriter (fileName); PrintWriter printWriter = nový PrintWriter (fileWriter); printWriter.print ("Niektorý reťazec"); printWriter.printf ("Názov produktu je% sa jeho cena je% d $", "iPhone", 1000); printWriter.close (); }

Výsledný súbor bude obsahovať:

Niektorý reťazcový názov produktu je iPhone a jeho cena je 1 000 $

Všimnite si, ako píšeme nielen raw String do súboru, ale aj nejaký formátovaný text s printf metóda.

Spisovateľa môžeme vytvoriť pomocou FileWriter, BufferedWriter, alebo dokonca System.out.

4. Píšte s FileOutputStream

Pozrime sa teraz, ako môžeme použiť FileOutputStream do zapisovať binárne údaje do súboru.

Nasledujúci kód prevádza a String do bajtov a zapíše bajty do súboru pomocou FileOutputStream:

@Test public void givenWritingStringToFile_whenUsingFileOutputStream_thenCorrect () vyvolá IOException {String str = "Hello"; FileOutputStream outputStream = nový FileOutputStream (názov súboru); byte [] strToBytes = str.getBytes (); outputStream.write (strToBytes); outputStream.close (); }

Výstupom v súbore bude samozrejme:

Ahoj

5. Píšte s DataOutputStream

Ďalej sa pozrime, čo môžeme použiť DataOutputStream napísať a String do súboru:

@Test public void givenWritingToFile_whenUsingDataOutputStream_thenCorrect () vyvolá IOException {String value = "Hello"; FileOutputStream fos = nový FileOutputStream (názov súboru); DataOutputStream outStream = nový DataOutputStream (nový BufferedOutputStream (fos)); outStream.writeUTF (hodnota); outStream.close (); // overenie výsledkov String result; FileInputStream fis = nový FileInputStream (názov súboru); Čítačka DataInputStream = nový DataInputStream (fis); výsledok = reader.readUTF (); reader.close (); assertEquals (hodnota, výsledok); }

6. Píšte s RandomAccessFile

Poďme si teraz ilustrovať, ako na to zapisovať a upravovať v existujúcom súbore než len písať do úplne nového súboru alebo pripájať k existujúcemu súboru. Zjednodušene: Potrebujeme náhodný prístup.

RandomAccessFile nám umožňuje písať na konkrétnom mieste v súbore s posunom - od začiatku súboru - v bajtoch.

Tento kód zapíše celočíselnú hodnotu s posunom daným od začiatku súboru:

private void writeToPosition (názov súboru reťazca, int dáta, dlhá pozícia) vyvolá IOException {RandomAccessFile writer = nový RandomAccessFile (názov súboru, "rw"); spisovateľ.hľadať (pozícia); writer.writeInt (údaje); writer.close (); }

Ak chceme čítať int uložené na konkrétnom mieste, môžeme použiť túto metódu:

private int readFromPosition (názov súboru reťazca, dlhá pozícia) vyvolá IOException {int result = 0; Čítačka RandomAccessFile = nový RandomAccessFile (názov súboru, "r"); čitateľ.hľadať (pozícia); výsledok = reader.readInt (); reader.close (); návratový výsledok; }

Aby sme vyskúšali naše funkcie, napíšme celé číslo, upravme ho a nakoniec si ho prečítajme späť:

@Test public void whenWritingToSpecificPositionInFile_thenCorrect () vyvolá IOException {int data1 = 2014; int data2 = 1 500; writeToPosition (názov súboru, data1, 4); assertEquals (data1, readFromPosition (názov súboru, 4)); writeToPosition (názov súboru2, údaje2, 4); assertEquals (data2, readFromPosition (názov súboru, 4)); }

7. Píšte s FileChannel

Ak máme do činenia s veľkými súbormi, FileChannel môže byť rýchlejší ako štandardné IO. Nasledujúci kód píše String do súboru pomocou FileChannel:

@Test public void givenWritingToFile_whenUsingFileChannel_thenCorrect () hodí IOException {RandomAccessFile stream = new RandomAccessFile (fileName, "rw"); Kanál FileChannel = stream.getChannel (); Hodnota reťazca = "Dobrý deň"; byte [] strBytes = value.getBytes (); ByteBuffer buffer = ByteBuffer.allocate (strBytes.length); buffer.put (strBytes); buffer.flip (); channel.write (buffer); stream.close (); channel.close (); // overenie RandomAccessFile reader = new RandomAccessFile (fileName, "r"); assertEquals (value, reader.readLine ()); reader.close (); }

8. Píšte s Súbory Trieda

Java 7 predstavuje nový spôsob práce so súborovým systémom spolu s novou triedou nástrojov: Súbory.

Pomocou Súbory triedy, môžeme vytvárať, presúvať, kopírovať a mazať súbory a adresáre. Môže sa tiež použiť na čítanie a zápis do súboru:

@ Test public void givenUsingJava7_whenWritingToFile_thenCorrect () hodí IOException {String str = "Hello"; Path path = Paths.get (názov súboru); byte [] strToBytes = str.getBytes (); Files.write (cesta, strToBytes); Reťazec read = Files.readAllLines (cesta) .get (0); assertEquals (str, čítať); }

9. Zápis do dočasného súboru

Teraz sa pokúsime zapísať do dočasného súboru. Nasledujúci kód vytvorí dočasný súbor a napíše a String k tomu:

@Test public void whenWriteToTmpFile_thenCorrect () vyvolá IOException {String toWrite = "Hello"; File tmpFile = File.createTempFile ("test", ".tmp"); Zapisovač FileWriter = nový FileWriter (tmpFile); writer.write (toWrite); writer.close (); Čítačka BufferedReader = nový BufferedReader (nový FileReader (tmpFile)); assertEquals (toWrite, reader.readLine ()); reader.close (); }

Ako vidíme, je to len vytvorenie dočasného súboru, ktoré je zaujímavé a odlišné. Po tomto bode je zápis do súboru rovnaký.

10. Pred zápisom zamknite súbor

Nakoniec pri písaní do súboru niekedy potrebujeme zaistiť, aby do tohto súboru nepísal súčasne nikto iný. V zásade musíme byť schopní tento súbor počas zápisu uzamknúť.

Využime to FileChannel pred zápisom do súboru skúste súbor zamknúť:

@Test public void when TryToLockFile_thenItShouldBeLocked () vyvolá IOException {RandomAccessFile stream = new RandomAccessFile (fileName, "rw"); Kanál FileChannel = stream.getChannel (); FileLock lock = null; try {lock = channel.tryLock (); } catch (final OverlappingFileLockException e) {stream.close (); channel.close (); } stream.writeChars ("testovacia zámka"); lock.release (); stream.close (); channel.close (); }

Upozorňujeme, že ak je súbor už uzamknutý, keď sa pokúšame zámok získať, zobrazí sa príkaz OverlappingFileLockException bude vyhodený.

11. Poznámky

Po preskúmaní toľkých metód zápisu do súboru poďme diskutovať o niekoľkých dôležitých poznámkach:

  • Ak sa pokúsime čítať zo súboru, ktorý neexistuje, a FileNotFoundException bude vyhodený.
  • Ak sa pokúsime zapísať do súboru, ktorý neexistuje, vytvorí sa najskôr súbor a nebude vyvolaná žiadna výnimka.
  • Po jeho použití je veľmi dôležité prúd uzavrieť, pretože nie je implicitne uzavretý, aby sa uvoľnili akékoľvek zdroje s ním spojené.
  • Vo výstupnom prúde Zavrieť() volania metód spláchnuť() pred uvoľnením prostriedkov, čo vynúti zápis všetkých bajtov s medzipamäťou do streamu.

Pri pohľade na bežné postupy používania môžeme vidieť napríklad to PrintWriter sa používa na písanie formátovaného textu, FileOutputStream zapisovať binárne údaje, DataOutputStream písať primitívne dátové typy, RandomAccessFile písať na konkrétnu pozíciu a FileChannel písať rýchlejšie do väčších súborov. Niektoré z rozhraní API týchto tried umožňujú viac, ale je to dobré miesto pre začiatok.

12. Záver

Tento článok ilustroval veľa možností zápisu údajov do súboru pomocou Java.

Implementáciu všetkých týchto príkladov a útržkov kódu nájdete na GitHub.


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