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álny prístup k priečinku AppData v Jave

V tomto krátkom tutoriálu si popíšeme, ako si multiplatformový zabezpečíme prístup k priečinku pre ukladanie dát aplikácie. Vo Windows je táto zložka známa ako %appdata% - C:\Users\<Account>\AppData\Roaming\<AppAuthor>\<AppName>, v Linuxe je to /home/<account>/.local/share/<AppName> a v MacOS by cesta mala byť približne /Users/<Account>/Library/Application Support/<AppName>. Kvôli rozmanitosti týchto ciest neexistuje v Jave natívne riešenie, pomocou ktorého by sme si ľahko vyžiadali prístup k týmto zložkám.

Závislosti

Pre ľahký prístup budeme musieť siahnuť po knižnici tretej strany. Určite ich existuje viac, ale ja tu popíšem iba jednu, pretože s ňou mám skúsenosti. Ide o projekt appdirs na GitHub. Na správu závislosťou budeme používať grádl, ale pre Maven bude postup veľmi podobný.

Nový projekt

Projekt budem tvoriť v IntelliJ Idea. Spustíme teda IDE a klikneme na tlačidlo Create New Project:

Vytvorenie nového projektu v IntelliJ Idea - Práca so súbormi v Jave

V ponuke vyberieme, že chceme Java projekt spravovaný pomocou grádl:

Java projekt spravovaný grádl v IntelliJ Idea - Práca so súbormi v Jave

Do prvého políčka vložíme názov organizácie či iný identifikátor. Druhé políčko je pre názov aplikácie

Názov projektu v IntelliJ Idea - Práca so súbormi v Jave

V nastavení grádl zaškrtneme políčko pre Autoimport, aby sme nemuseli ručne projekt synchronizovať:

Nastavenie grádl v IntelliJ Idea - Práca so súbormi v Jave

Nakoniec nastavíme cestu k projektu:

Nastavenie cesty projektu v IntelliJ Idea - Práca so súbormi v Jave

Vyhľadanie repozitára

Keď sme úspešne založili projekt, prejdeme na stránku Maven repository, kde do vyhľadávacieho políčka zadáme názov knižnice: appdirs a zvolíme vyhľadať. Zvolíme prvá možnosť, teda tú knižnicu, ktorá je v balíčku net.harawata.appdirs a vyberieme najnovšiu verziu:

Vyhľadanie knižnice v MVN central repository - Práca so súbormi v Jave

Na nasledujúcej stránke sa prepneme do záložky s grádl a skopírujeme si závislosť, ktorú pridáme do zoznamu závislostí v grádl:

Skopírovanie príslušné závislosti knižnice - Práca so súbormi v Jave

Pre tých, ktorí by na stránku nechceli chodiť, pridávam závislosť na kopírovanie nižšie:

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

Zostavenie

Otvoríme si súbor buid.gradle a na konci súboru, do zoznamu závislostí, vložíme skopírovaný riadok z webu:

Náhľad na IDE s importovanými knižnicami - Práca so súbormi v Jave

Za niekoľko málo okamihov by sa mal projekt automaticky aktualizovať a stiahnuť potrebné závislosti. Celkom sa stiahnu 4 knižnice:

  • net.harawata: appdirs: 1.0.3
  • net.java.dev.jna: bra-platform: 4.5.2
  • net.java.dev.jna: bra: 4.5.2
  • org.slf4j: slf4j-api: 1.7.25

Prvá je knižnica, ktorú sme si my sami vyžiadali. Táto knižnica má dve závislosti: jna a slf4j. Prvá spomínaná knižnica sa používa na prístup volanie systémových funkcií. Druhá sa používa pre logovanie.

Zoznámenie sa s knižnicou

Než sa pustíme do programovania, bolo by fajn sa najprv s knižnicou zoznámiť. Povieme si, aké triedy / rozhrania knižnica ponúka a čo všetko môžeme použiť.

AppDirs

Trieda AppDirs predstavuje hlavné komunikačné rozhranie, pomocou ktorého získavame prístup ku zložkám. Trieda obsahuje nasledujúce metódy pre prístup ku zložkám:

  • getUserDataDir() - Vráti systémovú zložku pre dáta aplikácie
  • getUserConfigDir() - Komponent konfiguračné súbory aplikácie
  • getUserCacheDir() - Komponent cache aplikácie
  • getUserLogDir() - Komponent logy aplikácie

K vytvoreniu inštancie je potrebný továrenské metóda AppDirs.getInstance(), ktorá má v sebe zakomponovanú logiku, podľa ktorej sa rozhodne, ako inštanciu vytvorí. Predovšetkým sa pozrie, na akom OS je program spustený a podľa toho vyberie jednu z troch implementáciu:

  • WindowsAppDirs
  • MacOSXAppDirs
  • UnixAppDirs

Vďaka tomu, že je projekt na GitHub, sa môžeme pozrieť, ako táto 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();
  }
}

Zo systémové vlastnosti os.name sa určí, či ak sa jedná o MacOS, Windows, alebo akýkoľvek Linux. Pravda, teraz si možno hovoríte, prečo využiť knižnicu, keď si toto všetko môžete napísať sami. Ide o to, že tu už sú vyriešené problémy typu oddeľovača zložiek a ďalšie veci. Napríklad aby sme vo Windows získali cestu k priečinku %appdata%, musíme využiť volanie natívnych metód. O toto všetko sa knižnica postará za nás.

Testovanie knižnice

Teraz si vytvoríme jednoduchú konzolovú aplikáciu, kde si necháme vytvoriť inštanciu triedy AppDirs, cez ktorú sa dostaneme k najrôznejším zložkám aplikácie.

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ýsledok aplikácie pre Linux vyzerá nasledovne:

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

To by bolo z návodu všetko. Dúfam, že som vám ušetril dlhé hodiny bádania, ako získať prístup k priečinku dát aplikácií univerzálne na všetkých operačných systémoch.

V nasledujúcom cvičení, Riešené úlohy k 11.-14. lekciu práce so súbormi v Jave, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Predchádzajúci článok
Práca s vlastnými súbory v Jave - Ukladanie a načítanie zips
Všetky články v sekcii
Práca so súbormi v Jave
Preskočiť článok
(neodporúčame)
Riešené úlohy k 11.-14. lekciu práce so súbormi v Jave
Článok pre vás napísal Petr Štechmüller
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje primárně programování v Javě, ale nebojí se ani webových technologií.
Aktivity