IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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

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 - Soubory v Javě

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

Java projekt spravovaný Gradlem v IntelliJ Idea - Soubory v Javě

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 - Soubory v Javě

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

Nastavení gradlu v IntelliJ Idea - Soubory v Javě

Nakonec nastavíme cestu k projektu:

Nastavení cesty projektu v IntelliJ Idea - Soubory v Javě

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 - Soubory v Javě

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 - Soubory v Javě

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 - Soubory v Javě

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.


 

Předchozí článek
Kvíz - Soubory v Javě
Všechny články v sekci
Soubory v Javě
Článek pro vás napsal Petr Štechmüller
Avatar
Uživatelské hodnocení:
4 hlasů
Autor se věnuje primárně programování v Javě, ale nebojí se ani webových technologií.
Aktivity