2. díl - Úvod do práce se soubory v Javě

Java Práce se soubory Úvod do práce se soubory v Javě

V minulém dílu našeho seriálu tutoriálů o Javě jsme si vysvětlili výjimky, které k práci se soubory nutně potřebujeme, protože díky nim můžeme reagovat na případné chyby. Dnes si povíme něco o souborech obecně a o právech k zápisu v systémech Windows. Po dočtení tohoto tutoriálu budete připraveni se soubory pracovat.

Data, resp. objekty uložené v paměti, se samozřejmě s vypnutím aplikace ztratí. Pokud chceme zajistit, aby data byla tzv. perzistentní (trvalá), musíme je při ukončení programu uložit a při načtení programu opět načíst. K ukládání dat aplikace existuje mnoho způsobů, každý má nějaké výhody a nevýhody. Obecně můžeme ukládat data naší aplikace následujícím způsobem:

  • Textové soubory s jednoduchou strukturou (např. .txt a .csv)
  • textové soubory s vnitřní hierarchií (např. .xml nebo .json)
  • Soubory binárního typu (jednoduše otisk paměti do souboru)
  • Databáze

Každý způsob uložení dat má své výhody a nevýhody. My si jednotlivé způsoby v seriálu podrobně popíšeme a hlavně vyzkoušíme. Zaměříme se zejména na to, jak do souborů ukládat objekty a poté je znovu načítat. Databázím se poté věnuje samostatná sekce.

Práva k zápisu v systémech Windows

Windows 7 zápisová práva UAC

Od Windows Vista existuje v systémech Windows tzv. UAC (User Account Control). Technologie zakazuje zápis na systémový oddíl disku (nejčastěji C:) v případě, že zápis není povolen administrátorem nebo že se nejedná o zápis do osobních složek uživatele. Toto opatření samozřejmě naplnilo diskuzní fóra o programování a rozbilo řadu aplikací. Důležité však je, že toto opatření je správné a pouze zabraňuje špatně napsaným aplikacím měnit co se jim zlíbí. Linuxové systémy mají podobná opatření již dlouhou dobu.

Koncepce systému Windows zahrnuje uživatelské účty. Každý uživatelský účet je realizován složkou (většinou C:\users\jmeno_u­zivatele). Tato složka obsahuje mimo jiné dokumenty, pracovní plochu a také tzv. složku s daty aplikací. K této složce se lze dostat při zadání klíče %appdata% do cesty. Zkuste si %appdata% napsat do cesty průzkumníka a složku otevřít. Uvidíte, že ve složce má své podsložky mnoho aplikací, které máte nainstalovány. Právě zde je místo pro nastavení vašich aplikací a další data. Vaše aplikace si zde samozřejmě vytvoří složku se svým jménem a do té si bude vše ukládat. Nebudeme omezováni UAC a zároveň bude naše aplikace umožňovat jiné nastavení pro různé uživatele, aniž bychom to v Javě programovali. %appdata% míří vždy k appdata aktuálně přihlášeného uživatele.

Velkou chybou bylo, že si programy ukládaly data do složky s programem. Program na ploše nebo na starých Windows fungoval, nicméně když se poté nainstaloval do složky program files na disku C, spadl s chybou při zápisu na disk. Windows tento zápis částečně pro určité aplikace emulovala, ale tím se nebudeme zabývat. Problém lze samozřejmě obejít tím, že aplikaci spustíme jako správce, ale to je špatné řešení.

V tomto tutoriálu si ukážeme, jak vytvořit v appdata složku pro naši aplikaci. V dalších tutoriálech již v kódu tato logika nebude obsažena a budou sloužit jako co nejjednodušší ukázka práce se soubory. Pokud budete aplikaci provozovat na svém počítači, nemusíte se o nic starat. Jakmile ji však budete publikovat, je vhodné ji upravit tak, aby appdata používala. Již tedy víme, kam budeme zapisovat. Výjimky jsme si uvedli také. Přesuňme se tedy k samotné práci se soubory.

Stream

V Javě existuje tzv. stream, což je obecný "datový proud". Na proud se napojíme a můžeme z něj poté načítat data nebo do něj data naopak zapisovat. Proud je teoreticky univerzální a ten samý proud se může necházet v paměti RAM nebo v souboru na disku. Práce se soubory je tedy realizována právě přes stream a všechny třídy, které si v budoucnu uvedeme, stream nějakým způsobem obalují nebo s ním pracují. My jsme od něj však odstíněni.

V této sekci se budeme v každém tutoriálu zabývat jedním typem souboru a ukážeme si vždy tu třídu, která je k tomu uzpůsobena. Nyní si ukažme naprostý základ toho, jak vytvořit pro naši aplikaci složku v appdata aktuálního uživatele. Budeme k tomu používat třídu File, která obsahuje metody pro práci se soubory a složkami. Pojďme tedy napsat aplikaci, která bude mít vlastní složku v AppData a podívá se, jestli existuje její soubor databaze.dat.

String cesta = "";

cesta = System.getenv("APPDATA") + File.separator + "DevbookTutorial";
File fCesta = new File(cesta);
if (!fCesta.isDirectory())
{
                if (!fCesta.mkdirs())
                {
                                System.out.printf("Nepodařilo se vytvořit složku %s, zkontrolujte prosím svá oprávnění.", cesta);
                }
}

File fDatabaze = new File(cesta + File.separator + "databaze.dat");
if (fDatabaze.exists())
{
                try
                {
                                // Zde umístěte kód pro načtení vašeho nastavení ze souboru
                }
                catch (Exception e)
                {
                                System.out.printf("Při načítání nastavení došlo k následující chybě: %s", e.getMessage());
                }
}
else
{
                try
                {
                                // Zde umístěte kód pro vytvoření vašeho nastavení ze souboru
                }
                catch (Exception e)
                {
                                System.out.printf("Při vytvoření nastavení došlo k následující chybě: %s", e.getMessage());
                }
}

Nejprve si uložíme cestu ke složce s naší aplikací do textového řetězce cesta. Lokaci appdata získáme pomocí:

System.getenv("APPDATA")

Pro Windows 7 a 8 nám metoda vrátí něco takového:

C:\Users\vase_jmeno\AppData\Roaming

Pokud chcete, aby vaše aplikace fungovala i na dalších operačních systémech, budete muset použít nějakou knihovnu, která toto řeší. Java k tomuto bohužel neposkytuje vůbec žádnou funkcionalitu.

Do cesty přidáme ještě složku se jménem naší aplikace. Jméno jsem zvolil DevbookTutorial, samozřejmě si ho poté upravte. V cesta je tedy nyní toto:

C:\Users\vase_jmeno\AppData\Roaming\DevbookTutorial

Pokud daná složka neexistuje (jedná se o první spuštění aplikace), tak ji vytvoříme. Dále se podíváme, zda existuje soubor, ze kterého chceme data načítat. Pokud ano, provedeme načtení dat. Pokud ne, soubor vytvoříme a nahrajeme do něj výchozí data. Nebo soubor vytvářet ani nebudeme, záleží na typu aplikace.

Po spuštění kódu se nám ve složce %appdata% objeví nová složka:

Appdata a tvoření složky aplikace v Javě

Máme tedy rychlý úvod, jak správně ukládat data aplikace. O výjimkách jsme si také řekli. Nic nám již nebrání, abychom si příště ukázali práci s prvním formátem souborů, budou to textové soubory. Ještě raději zopakuji, že v následujících tutoriálech kvůli jednoduchost nebudu řešit zápisová práva a programy budou fungovat jen v dokumentech NetBeans. Vždy se tedy vraťte sem a kód si upravte, pokud hotovou aplikaci budete chtít šířit.


 

Stáhnout

Staženo 443x (16.31 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

  Aktivity (1)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (7 hlasů) :
3.857143.857143.857143.85714 3.85714


 


Miniatura
Předchozí článek
Výjimky v Javě
Miniatura
Všechny články v sekci
Práce se soubory v Javě
Miniatura
Následující článek
Práce s textovými soubory v Javě

 

 

Komentáře

Avatar
Kit
Redaktor
Avatar
Kit:

Proč tam máš tuhle podivnost?

if (fDatabaze.exists())

Koleduješ si o race condition.

Odpovědět  -2 6.5.2013 15:47
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Homo
Člen
Avatar
Odpovídá na Kit
Homo:

Koleduje si o vic veci, NIO.2 mu asi nic nerika. Trida File se uz moc nepouziva, spoustu veci je tam problemovych a pouziva se jen u trid, ktere nepodporuji novou tridu Path, ale ta nastesti obsahuje metodu toFile().

Odpovědět 6.5.2013 20:52
1010011 1000101 1011000
Avatar
DaveS
Neregistrovaný
Avatar
DaveS:

Celkově tuhle část tutoriálu nepovažuju za dobře zpracovanou, jinak vaši práci oce
ńuju a moc mi tahle stránka pomohla. Díky, jen tak dál. Ale u téhle kapitoly by ocenil bližší přiblížení.

 
Odpovědět 23.10.2013 11:32
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na DaveS
David Čápka:

Já nepovažuji za dobře zpracovanou tvojí kritiku, jelikož vůbec nic neříká.

Odpovědět  ±0 23.10.2013 11:41
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
vlastajuracka:

Chtěl bych se zeptat co dělají tyto příkazy:
File.separator
mkdirs()
printf
Díky moc :) a ještě mam otázku k tomu e.getMessage to přímo vypíše chybá jká tam je ano ?

 
Odpovědět 27.10.2015 22:14
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.