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:
fileje proměnná reprezentující objektRandomAccessFile.nazev_souboru.txtje 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.