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í objektRandomAccessFile
.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
.