Univerzálny prístup k priečinku AppData v Jave
V predchádzajúcom kvíze, Kvíz - Súbory v Jave, sme si overili nadobudnuté skúsenosti z kurzu.
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:
V ponuke vyberieme, že chceme Java projekt spravovaný pomocou grádl:
Do prvého políčka vložíme názov organizácie či iný identifikátor. Druhé políčko je pre názov aplikácie
V nastavení grádl zaškrtneme políčko pre Autoimport, aby sme nemuseli ručne projekt synchronizovať:
Nakoniec nastavíme cestu k projektu:
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:
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:
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:
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áciegetUserConfigDir()
- Komponent konfiguračné súbory aplikáciegetUserCacheDir()
- Komponent cache aplikáciegetUserLogDir()
- 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.