Příklad Java RandomAccessFile

Třída RandomAccessFile v jazyce Java představuje mocný nástroj pro práci se soubory, který umožňuje přímý přístup k datům na jakékoli pozici. Na rozdíl od běžného sekvenčního čtení a zápisu, s RandomAccessFile můžete operovat s libovolnou částí souboru bez nutnosti zpracovávat jej od začátku do konce. Tato funkcionalita je neocenitelná při manipulaci s velkými soubory, kde potřebujete rychle přistupovat jen k specifickým datovým úsekům.

RandomAccessFile je typem streamu s možností vyhledávání. To znamená, že můžete kdykoli přesunout kurzor čtení/zápisu na určenou pozici v rámci souboru. Tím se otevírají nové možnosti pro sofistikovanou práci s daty – můžete číst nebo zapisovat byty, celá čísla různých velikostí, znaky, nebo dokonce řetězce, a to v jakémkoli požadovaném formátu.

Základní použití RandomAccessFile

Pro vytvoření instance RandomAccessFile se používá následující konstrukce:

RandomAccessFile file = new RandomAccessFile("nazev_souboru.txt", "rw");

Kde:

  • file je proměnná reprezentující objekt RandomAccessFile.
  • nazev_souboru.txt je jméno souboru, se kterým chceme pracovat.
  • "rw" definuje přístupový režim, který v tomto případě umožňuje jak čtení, tak i zápis.

Po inicializaci objektu můžete s ním provádět různé operace, jako:

Čtení dat

  • int read() – načte jeden byte z aktuální pozice kurzoru.
  • byte[] read(byte[] buffer) – zaplní zadaný byte array s daty ze souboru.
  • String readLine() – přečte celý řádek textu z aktuálního místa v souboru.
  • long getFilePointer() – vrátí aktuální pozici kurzoru v souboru (v bytech od začátku souboru).

Zápis dat

  • void write(int byteValue) – zapíše jediný byte na aktuální pozici kurzoru.
  • void write(byte[] buffer) – zapíše obsah byte array do souboru.
  • void writeLine(String line) – zapíše řádek textu na aktuální pozici kurzoru.
  • void seek(long position) – přesune kurzor na určenou pozici (v bytech) v souboru.

Dostupné metody třídy RandomAccessFile

RandomAccessFile nabízí bohatou sadu metod pro manipulaci se soubory. Zde jsou některé z nich:

  • void close() – Uvolní prostředky a uzavře soubor.
  • long length() – Zjistí celkovou délku souboru v bytech.
  • void setLength(long newLength) – Upraví délku souboru.
  • Channel getChannel() – Získá kanál souboru.
  • FileChannel channel() – Vrátí kanál souboru pro pokročilejší operace.
  • FileDescriptor getFD() – Získá deskriptor souboru.
  • boolean readBoolean() – Načte booleovskou hodnotu.
  • byte readByte() – Načte jeden byte.
  • char readChar() – Načte jeden znak.
  • double readDouble() – Načte double.
  • float readFloat() – Načte float.
  • int readInt() – Načte celé číslo (int).
  • long readLong() – Načte celé číslo (long).
  • short readShort() – Načte krátké celé číslo (short).
  • String readUTF() – Načte řetězec v kódování UTF-8.
  • void writeBoolean(boolean v) – Zapíše booleovskou hodnotu.
  • void writeByte(int v) – Zapíše jeden byte.
  • void writeChar(int v) – Zapíše znak.
  • void writeDouble(double v) – Zapíše double.
  • void writeFloat(float v) – Zapíše float.
  • void writeInt(int v) – Zapíše celé číslo (int).
  • void writeLong(long v) – Zapíše celé číslo (long).
  • void writeShort(int v) – Zapíše krátké celé číslo (short).
  • void writeUTF(String str) – Zapíše řetězec v kódování UTF-8.

Závěrem

RandomAccessFile je velmi užitečný nástroj pro flexibilní práci se soubory v Javě. Díky možnosti přímého přístupu k datům na libovolné pozici je vhodný pro aplikace, které vyžadují rychlý přístup k datům uvnitř velkých souborů. Umožňuje nejen čtení a zápis, ale také efektivní navigaci uvnitř souboru a detailní manipulaci s datovými typy. Jedná se o univerzální třídu pro různé scénáře zpracování souborů.

Často kladené otázky

1. K čemu konkrétně se používá RandomAccessFile?

RandomAccessFile je určen pro přímý přístup k datům v souboru, umožňuje čtení a zápis na libovolné pozici, což je výhodné při zpracování velkých souborů.

2. Jak se vytváří instance RandomAccessFile?

Instanci RandomAccessFile vytvoříme pomocí:

RandomAccessFile file = new RandomAccessFile("nazev_souboru.txt", "rw");

kde "nazev_souboru.txt" je jméno souboru a "rw" definuje režim čtení i zápisu.

3. Jak se čte data z RandomAccessFile?

Používají se metody jako read() pro čtení bytu, read(byte[]) pro čtení byte array, nebo readLine() pro čtení řádku.

Například pro načtení jednoho byte:

int b = file.read();

4. Jak se zapisují data do RandomAccessFile?

Pro zápis se používají metody jako write(int) pro zápis bytu, write(byte[]) pro zápis pole bytů, nebo writeLine(String) pro zápis celého řádku.

Například pro zápis jednoho byte:

file.write(b);

5. Jak se přesouvá kurzor na jinou pozici v RandomAccessFile?

K přesunu kurzoru slouží metoda seek(long position), kde `position` je pozice v bytech od začátku souboru.

Například pro přesun na pozici 100:

file.seek(100);

6. Jak zjistím délku souboru pomocí RandomAccessFile?

Délku souboru v bytech zjistíte pomocí metody length().

Například:

long length = file.length();

7. Jak se korektně uzavírá RandomAccessFile?

Soubor se uzavře pomocí metody close(), čímž uvolníme systémové prostředky.

Například:

file.close();

8. Jak získáme kanál souboru pomocí RandomAccessFile?

Kanál souboru se získá pomocí metody getChannel().

Například:

FileChannel channel = file.getChannel();

9. Proč použít RandomAccessFile místo FileInputStream nebo FileOutputStream?

RandomAccessFile je vhodný, pokud potřebujete přistupovat k datům v souboru na libovolných pozicích. Oproti tomu, FileInputStream a FileOutputStream jsou vhodné pro sekvenční čtení/zápis.

10. Je RandomAccessFile bezpečný pro použití v multithreadingovém prostředí?

RandomAccessFile není implicitně bezpečný pro vlákna. Pro práci s ním v multi-threading prostředí je nutné používat mechanismy synchronizace, například třídu java.nio.channels.FileLock.