Java týden
Procvič si angličtinu zdarma s naším americkým e-learningem! Learn more
Pouze tento týden sleva až 80 % na celý Java e-learning!

Univerzální přístup ke složce AppData v Javě

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V tomto krátkém tutoriálu si popíšeme, jak si multiplatformně zajistíme přístup ke složce pro ukládání dat aplikace. Ve Windows je tato složka známá jako %appdata% - C:\Users\<Account>\AppData\Roaming\<AppAuthor>\<AppName>, v Linuxu je to /home/<account>/.local/share/<AppName> a v MacOS by cesta měla být přibližně /Users/<Account>/Library/Application Support/<AppName>. Kvůli rozmanitosti těchto cest neexistuje v Javě nativní řešení, pomocí kterého bychom si snadno vyžádali přístup k těmto složkám.

Závislosti

Pro snadný přístup budeme muset sáhnout po knihovně třetí strany. Určitě jich existuje více, ale já zde popíši pouze jednu, protože s ní mám zkušenosti. Jedná se o projekt appdirs na GitHubu. Ke správě závislostí budeme používat Gradle, ale pro Maven bude postup velice podobný.

Nový projekt

Projekt budu tvořit v IntelliJ Idea. Spustíme tedy IDE a klikneme na tlačítko Create New Project:

Vytvoření nového projektu v IntelliJ Idea

V nabídce vybereme, že chceme Java projekt spravovaný pomocí Gradlu:

Java projekt spravovaný Gradlem v IntelliJ Idea

Do prvního políčka vložíme název organizace či jiný identifikátor. Druhé políčko je pro název aplikace

Název projektu v IntelliJ Idea

V nastavení Gradlu zaškrtneme políčko pro AutoImport, abychom nemuseli ručně projekt synchronizovat:

Nastavení gradlu v IntelliJ Idea

Nakonec nastavíme cestu k projektu:

Nastavení cesty projektu v IntelliJ Idea

Vyhledání repositáře

Když jsme úspěšně založili projekt, přejdeme na stránku Maven repository, kde do vyhledávacího políčka zadáme název knihovny: appdirs a zvolíme vyhledat. Zvolíme první možnost, tedy tu knihovnu, která je v balíčku net.harawata.appdirs a vybereme nejnovější verzi:

Vyhledání knihovny v MVN central repository

Na následující stránce se přepneme do záložky s Gradle a zkopírujeme si závislost, kterou přidáme do seznamu závislostí v Gradlu:

Zkopírování příslušné závislosti knihovny

Pro ty, kteří by na stránku nechtěli chodit, přidávám závislost ke zkopírování níže:

// https://mvnrepository.com/artifact/net.harawata/appdirs
compile group: 'net.harawata', name: 'appdirs', version: '1.0.3'

Sestavení

Otevřeme si soubor buid.gradle a na konci souboru, do seznamu závislostí, vložíme zkopírovaný řádek z webu:

Náhled na IDE s importovanými knihovnami

Za několik málo okamžiků by se měl projekt automaticky aktualizovat a stáhnout potřebné závislosti. Celkem se stáhnou 4 knihovny:

  • net.harawata:ap­pdirs:1.0.3
  • net.java.dev.jna:jna-platform:4.5.2
  • net.java.dev.jna:jna:4­.5.2
  • org.slf4j:slf4j-api:1.7.25

První je knihovna, kterou jsme si my sami vyžádali. Tato knihovna má dvě závislosti: jna a slf4j. První zmíněná knihovna se používá k přístupu volání systémových funkcí. Druhá se používá pro logování.

Seznámení se s knihovnou

Než se pustíme do programování, bylo by fajn se nejprve s knihovnou seznámit. Povíme si, jaké třídy/rozhraní knihovna nabízí a co vše můžeme použít.

AppDirs

Třída AppDirs představuje hlavní komunikační rozhraní, pomocí něhož získáváme přístup ke složkám. Třída obsahuje následující metody pro přístup ke složkám:

  • getUserDataDir() - Vrátí systémovou složku pro data aplikace
  • getUserConfigDir() - Složka pro konfigurační soubory aplikace
  • getUserCacheDir() - Složka pro cache aplikace
  • getUserLogDir() - Složka pro logy aplikace

K vytvoření instance je zapotřebí tovární metoda AppDirs.getInstance(), která má v sobě zakomponovanou logiku, podle které se rozhodne, jak instanci vytvoří. Především se podívá, na jakém OS je program spuštěn a podle toho vybere jednu ze tří implementaci:

  • WindowsAppDirs
  • MacOSXAppDirs
  • UnixAppDirs

Díky tomu, že je projekt na GitHubu, se můžeme podívat, jak tato logika pracuje:

public static AppDirs getInstance() {
  String os = System.getProperty("os.name").toLowerCase();
  if (os.startsWith("mac os x")) {
    logger.debug("os.name {} is resolved to Mac OS X", os);
    return new MacOSXAppDirs();
  } else if (os.startsWith("windows")) {
    logger.debug("os.name {} is resolved to Windows", os);
    WindowsFolderResolver folderResolver = new ShellFolderResolver();
    return new WindowsAppDirs(folderResolver);
  } else {
    // Assume other *nix.
    logger.debug("os.name {} is resolved to *nix", os);
    return new UnixAppDirs();
  }
}

Ze systémové vlastnosti os.name se určí, zda-li se jedná o MacOS, Windows, nebo jakýkoliv Linux. Pravda, teď si možná říkáte, proč využít knihovnu, když si toto všechno můžete napsat sami. Jde o to, že zde již jsou vyřešeny problémy typu oddělovače složek a další věci. Například abychom ve Windows získali cestu ke složce %appdata%, musíme využít volání nativních metod. O toto vše se knihovna postará za nás.

Testování knihovny

Nyní si vytvoříme jednoduchou konzolovou aplikaci, kde si necháme vytvořit instanci třídy AppDirs, přes kterou se dostaneme k nejrůznějším složkám aplikace.

import net.harawata.appdirs.AppDirs;
import net.harawata.appdirs.AppDirsFactory;

public class App {

    private static final String CREDENTIALS_APP_NAME = "testovaciAplikace";
    private static final String CREDENTIALS_AUTHOR = "itnetwork";
    private static final String CREDENTIALS_VERSION = "v1.0";

    public static void main(String[] args) {
        final AppDirs appDirs = AppDirsFactory.getInstance();
        final String userDataDir = appDirs.getUserDataDir(CREDENTIALS_APP_NAME, CREDENTIALS_VERSION, CREDENTIALS_AUTHOR);
        final String userConfigDir = appDirs.getUserConfigDir(CREDENTIALS_APP_NAME, CREDENTIALS_VERSION, CREDENTIALS_AUTHOR);
        final String userCacheDir = appDirs.getUserCacheDir(CREDENTIALS_APP_NAME, CREDENTIALS_VERSION, CREDENTIALS_AUTHOR);

        System.out.printf("UserDataDir: %s%n", userDataDir);
        System.out.printf("UserConfigDir: %s%n", userConfigDir);
        System.out.printf("UserCacheDir: %s%n", userCacheDir);
    }
}

Výsledek aplikace pro Linux vypadá následovně:

Konzolová aplikace
UserDataDir: /home/petr/.local/share/testovaciAplikace/v1.0
UserConfigDir: /home/petr/.config/testovaciAplikace/v1.0
UserCacheDir: /home/petr/.cache/testovaciAplikace/v1.0

To by bylo z návodu vše. Doufám, že jsem vám ušetřil dlouhé hodiny bádání, jak získat přístup ke složce dat aplikací univerzálně na všech operačních systémech.


 

 

Článek pro vás napsal Petr Štechmüller
Avatar
Jak se ti líbí článek?
2 hlasů
Autor se věnuje primárně programování v Jave, ale nebojí se ani webových technologií.
Předchozí článek
Práce s vlastními soubory v Javě - Ukládání a načítání zip
Všechny články v sekci
Práce se soubory v Javě
Miniatura
Následující článek
Přehrávání zvuků (soubory wav) v Javě
Aktivity (7)

 

 

Komentáře

Avatar
krepsy3
Redaktor
Avatar
krepsy3:22. května 11:25

Ahoj, nechávám zatím bez hodnocení, protože doufám, že článek opravíš. Překlepů a pravopisných chyb jsem napočítal až moc, např. tuotriál, chybějící čárka před a (ano, mimo poměr slučovací se psát musí) a také konstrukt "by jste", což je jazyková odpornost, správně je "byste". Dále oprav ještě nepřesnost, ve windows %appdata% nevede přímo do složky AppData, ale do AppData\Roaming. Např. C# funkce Environment.Get­FolderPath vrací na argument SpecialFolder­.ApplicationDa­ta také složku Roaming.

Jinak se jedná o vcelku pěkný a podrobný článek :)

Odpovědět  +1 22. května 11:25
Programátor je stroj k převodu kávy na kód.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na krepsy3
David Čápka:22. května 12:06

Díky za reakci, změny jsem provedl.

Odpovědět  +1 22. května 12:06
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
krepsy3
Redaktor
Avatar
Odpovídá na David Čápka
krepsy3:22. května 13:17

Ještě koukám v úvodu je slovo multiplatformě, autor asi myslel multiplatformně. A v závěru chybí čárka za slovem bádání, plus bych tam napsal "...bádání, jak získat přístup ke složce s daty aplikací..." protože %appdata% je jen windowsí pojem :D

Odpovědět  +1 22. května 13:17
Programátor je stroj k převodu kávy na kód.
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 3 zpráv z 3.