FAV-ZCU/KIV PPA1/16. Soubory a adresáře.md

171 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Práce se soubory a složkami (adresáři)
- Se soubory se dá pracovat jako s nedělitelnými jednotkami, kdy je lze přesouvat, kopírovat, mazat atd.
- Obsah souboru se rovněž dá číst a zapisovat
### Základní pojmy
- Některé základní pojmy již byly zmíněny, zde budou uvedeny systematicky
#### Soubor a složka (adresář)
- Soubor (file)
- Základní jednotka uspořádání dat na disku (z pohledu uživatele i z pohledu programátora)
- Obsahuje data v závislosti na typu souboru
- Název souboru
- Např. ```data.txt, TBBT.s10.e13.avi```
- Jednoznačná identifikace souboru v rámci jedné složky
- V jedné složce nemůžou být dva soubory se stejným jménem
- POZOR!
- Linux je „case-sensitive“ (citlivý na velikost písmen), jména ```soubor.txt``` a ```Soubor.txt``` jsou tedy různá a mohou být v jedné složce (ale není to rozumné)
- Windows není „case-sensittive“, jména ```soubor.txt``` a ```Soubor.txt``` jsou tedy stejná a nemohou být v jedné složce
- Délka názvu je omezena (např. ve Windows na 255 znaků), ale je dostačující
- Název může obsahovat většinu běžných znaků s několika výjimkami (např. lomítko „/“ a zpětné lomítko „\“)
- Přípona souboru
- Vše od poslední tečky do konce názvu souboru (tj. je součástí názvu)
- Typicky udává typ souboru
- Většina souborů příponu má, ale mít ji nemusí
- Složka/adresář (folder/directory)
- Složky mají hierarchickou strukturu
- Název složky (adresáře)
- Platí stejná pravidla a omezení jako pro soubory
- Přípona složky
- Složky příponu většinou nemají
- Ale mohou ji mít
- Každá složka (adresář) může obsahovat další soubory a složky (adresáře)
- Ve skutečnosti se jedná o speciální soubor, který má v sobě (v nějaké formě) uložený seznam souborů a složek, které obsahuje
- Podrobněji viz předmět KIV/ZOS
#### Cesta a související pojmy
- Cesta (ke složce či k souboru)
- Posloupnost názvů složek, které jsou oddělené lomítkem „/“ (Linux i Windows) nebo zpětným lomítkem „\“ (Windows)
- Důležité složky (adresáře) se speciálním označením
- Kořenová složka (adresář) root folder (directory)
- Složka, která je v hierarchii nejvýše (sama v žádné složce neleží)
- Označuje se lomítkem „/“ (v Linuxu i ve Windows) nebo zpětným lomítkem „\“ (ve Windows)
- Ve Windows je kořenová složka na každém logickém disku (označeném písmenem)
- V Linuxu je jen jedna kořenová složka a další disky se připojují do hierarchické struktury složek
- Lze i ve Windows, ale příliš často se to nepoužívá
- Aktuální složka (adresář) current folder (directory)
- Složka, ve které se právě nacházíme (typicky složka, ze které je spuštěn náš program)
- Označuje se jednou tečkou „.“
- Tato speciální složka ukazuje sama na sebe a nachází se v každé složce
- Nadřazená složka (adresář) parent folder (directory)
- Složka, která je v hierarchii bezprostředně nad aktuální složkou
- Označuje se dvěma tečkami „..“
- Tato speciální složka odkazující na nadřazenou složku aktuální složky (tj. ve které se aktuální složka nachází) se nachází v každé složce
- V kořenové složce ukazuje stejně jako „.“ sama na sebe
- Absolutní cesta
- Začíná v kořenové složce, začíná lomítkem
- Např. /home/skola/ppa1
- Např. D:\Users\tpotuzak\Skola\PPA1
- Ve Windows má každý logický disk (označený písmenem) svou kořenovou složku, proto je písmeno (D:) součástí absolutní cesty v rámci jednoho disku začíná absolutní cesta „\“
- Při použití absolutní cesty je jedno, jaká je aktuální složka
- Z každé aktuální složky ukazuje na stejný objekt (složku nebo soubor)
- Relativní cesta
- Je relativní k aktuální složce k jednomu objektu jsou relativní cesty z různých aktuálních složek různé
- Může začínat
- Aktuální složkou „.“ (v Linuxu často nutné, ve Windows není nutné) nebo názvem podřazené složky (ve Windows)
- Nadřazenou složkou „..“
- Např. ```./skola/ppa1```
- Úplné jméno souboru (či složky)
- Jednoznačná identifikace souboru (či složky) v rámci celého souborového systému
- Absolutní cesta včetně názvu souboru (či složky)
- Např. ```D:\Users\tpotuzak\Skola\PPA1\data.txt```
### Rozhraní Path a třídy Paths a Files
- Pro práci se soubory jako s celky se dají využít třídy ```Paths, Files``` a rozhraní ```Path``` z balíku ```java.nio.file```
- Rozhraní ```Path``` reprezentuje cestu, tj. soubor nebo adresář (složku)
- Podrobně o rozhraní viz předmět KIV/OOP
- V dalším textu se budeme k rozhraní ```Path``` chovat, jako by to byla třída
- Třída ```Files``` obsahuje mnoho statických metod pro práci se soubory
- Kromě práce se souborem jako celkem umožňuje i práci s obsahem souboru
- Lze pracovat se soubory i složkami
- V názvech metod se používá se výhradně název „adresář“ („directory“), název „složka“ („folder“) se nepoužívá
- S adresáři lze provádět téměř stejné operace jako se soubory (mazání, přesun, kopírování, atd.), proto existuje jedna třída pro práci jak se soubory tak s adresáři
#### Zajištění nezávislosti na operačním systému
- Protože různé operační systémy používají různé oddělovače složek v cestě, je ve třídě ```File``` definována proměnná (řetězec) s oddělovačem, která je nastavená podle operačního systému, na kterém je program spuštěn
- ```File.separator```
- Tato proměnná by se měla používat, pokud vytváříme cestu z jednotlivých jmen adresářů
- V Linuxu je její hodnota "/", ve Windows je její hodnota "\\"
- Např. ```String jmeno = File.separator + "ppa1" + File.separator + " data.txt";```
- Třída File je z balíku java.io a původně se používala pro práci se soubory jako s celky (místo ```Path```, ```Paths```, a ```Files```)
- Pokud místo této proměnné použijeme přímo jedno z lomítek, pak je lepší použít obyčejné lomítko „/“, protože funguje na Linuxu i na Windows
- Zpětné lomítko se navíc v Javě používá pro zápis speciálních znaků (např. „\\n“ pro konec řádky) a je tedy nutné ho zdvojovat „\\\\“
#### Základní operace s cestou
- Rozhraní ```Path```
- Používá se jako parametr v mnoha metodách třídy ```Files``` (jako parametr určující soubor či složku, se kterou bude metoda pracovat)
- Soubor či adresář (složka) reprezentovaný instancí ```Path``` může, ale nemusí existovat
- Obsahuje pouze operace pro práce s cestou samotnou
- Vytvoření nové instance
- Nová instance se nevytváří konstruktorem, ale s využitím metody třídy ```get()``` pomocné třídy ```Paths```
- POZOR!
- Jedná se o jinou třídu než je rozhraní ```Path```
- Její metoda třídy ```get()``` vrací instanci rozhraní ```Path```
- ```Path cesta = Paths.get(retezecSCestou);```
- Např. ```Path soubor = Paths.get("data.txt");```
- Např. ```Path soubor = Paths.get("D:\\ppa1\\data.txt");```
- Je vhodné používat ```File.sepearator``` pro oddělení jednotlivých názvů adresářů
- Absolutní cesta
- Metoda ```toAbsolutePath()```
- Vrátí novou instanci ```Path``` reprezentující soubor nebo složku jako absolutní cestu
- Pokud už současná instance je absolutní cesta, vrátí stejnou instanci
- Pokud je současná instance relativní cesta, vytvoří z ní absolutní doplněním aktuálního adresáře (složky)
- Zjištění jména souboru či adresáře (složky)
- Metoda ```getFileName()```
- Vrátí poslední položku cesty (za posledním oddělovačem)
- Pokud je cesta ukončena oddělovačem, nevadí to, metoda stejně vrátí poslední položku cesty, nikoliv prázdný řetězec
- Převod na ```File``` (dříve používáno místo ```Path```) a obráceně
- Metoda instance ```Path.toFile()```
- Převede instanci ```Path``` na instanci ```File```
- Metoda instance ```File.toPath()```
- Převede instanci ```File``` na instanci ```Path```
- Převod na řetězec
- Standardní metoda ```toString()```
#### Práce se souborem nebo adresářem pomocí třídy Files
- Třída ```Files``` obsahuje mj. metody pro práci se souborem či adresářem jako celkem
- Jedná se o metody třídy a jako parametr mají instanci rozhraní ```Path``` určující, s jakým souborem mají pracovat
- Metody třídy ```Files``` pro práci se soubory a adresáři jako s celkem obecně vyhazují konkrétní výjimku odvozenou typicky od ```IOException```, podle toho, k jakému problému dojde
- Zjištění existence souboru
- Metoda ```Files.exists(soubor)```
- Vrátí ```true```, pokud zadaný soubor nebo adresář (instance ```Path```) fyzicky existuje na disku, jinak vrátí ```false```
- Zjištění, zda se jedná o adresář
- Metoda ```Files.isDirectory(soubor)```
- Vrací ```true```, pokud je zadaný souboru (instance ```Path```) adresář
- Pokud objekt neexistuje, nebo je to soubor, vrací ```false```
- Zjištění informací o souboru nebo adresáři
- Metoda ```Files.getLastModifiedTime(soubor)```
- Vrátí datum a čas poslední modifikace zadaného souboru nebo adresáře jako instanci třídy ```FileTime```
- Metoda ```toString()``` této třídy vrací datum a čas v čitelném formátu
- Pro neexistující soubory nebo adresáře vyhodí výjimku
- Metoda ```Files.size(soubor)```
- Vrátí velikost souboru v bytech
- Pro neexistující soubor vyhodí výjimku
- Pro adresář vrátí 0
- Smazání souboru či adresáře
- Metoda ```Files.delete(soubor```
- Smaže soubor nebo adresář
- Pokud soubor nebo adresář neexistuje, nebo adresář není prázdný, vyhodí výjimku
- Přejmenování/přesunutí souboru či adresáře
- Metoda ```Files.move(původníSoubor, cílovýSoubor)```
- Přejmenuje nebo přesune soubor nebo adresář
- Při neúspěchu (např. cílový soubor již existuje) vyhodí výjimku
- Kopírování souboru či adresáře
- Metoda ```Files.copy(původníSoubor, cílovýSoubor)```
- Překopíruje soubor nebo adresář
- Pokud se jedná o adresář, nezkopíruje se jeho obsah
- Při neúspěchu vyhodí výjimku
- Vytvoření adresáře
- Metoda ```createDirectories(adresář)```
- Vytvoří adresář (v případě nutnosti všechny dosud neexistující adresáře v cestě)
- Při neúspěchu vyhodí výjimku