Black friday Black friday
Aprílový black friday tě nenechá v klidu! Až 80 % prémiového obsahu zdarma. Více informací
Pouze tento týden slevy až 80 % na programování v Javě

Diskuze: Správná cesta ke zdroji (souboru)

Java Java Správná cesta ke zdroji (souboru) American English version English version

Aktivity (1)
Avatar
Navry
Člen
Avatar
Navry:11.12.2018 16:43

Nevím jak správně získat cestu ke zdroji, se kterým později pracuji.

Používám IntelliJ IDEA Community Edition

V projektu mám složku /res, marknutou jako "resources root", kde mám ten soubor.
Já jsem normálně při vývoji měl jako cestu String - "res/Soubor" a fungovalo to :-).

Pak jsem si vytvořil Artifact, zbuildoval to a když spustím JAR tak dostanu FileNotFoundEx­ception.

Podíval jsem se do JARu a tam je ten soubor přímo v kořeni toho JARu, není v žádný složce.

Struktura projektu:
src/balicek/.­../Trida.java
res/Soubor

Struktura výsledného JARu:
Soubor
balicek/.../Tri­da.class

Nevim jestli to je chyba čistě na úrovni Javy nebo i nějakýho nastavení toho Artifactu?

Pozn. Se souborem pracuji ve statické metodě.

Zkusil jsem: Zkoušel jsem získat cestu takto (což jsem našel na netu):

private static final ClassLoader loader = Trida.class.getClassLoader();
// pak cestu takhle
loader.getResource("Soubor").getFile()

Ale když to spustim v IDEI tak to hledá ve složce: out/production/Na­zevProjektu/Sou­bor

Chci docílit: Abych mohl pracovat se zdrojem jak při vývoji v IDE tak při normálním spuštění aplikace.

 
Odpovědět 11.12.2018 16:43
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Navry
Petr Štechmüller:11.12.2018 17:16

Ahoj, kdy máš ten soubor v koření toho JARu, tak mu zkus dát "absolutní" cestu, takže něco jako:

loader.getResource("/Soubor").getFile()

Teoreticky by to mohlo pomoct

Nahoru Odpovědět 11.12.2018 17:16
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Navry
Člen
Avatar
Odpovídá na Petr Štechmüller
Navry:11.12.2018 17:36

Když použiju absolutní cestu tak pak tady:

BufferedReader reader = new BufferedReader(new FileReader(loader.getResource("/Soubor").getFile()));

dostanu NullPointerEx­ception.

 
Nahoru Odpovědět 11.12.2018 17:36
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Navry
Petr Štechmüller:11.12.2018 17:38

Tak spusť ten artefact pod debuggerem a hoď breakpoint do místa, kdě přistupuješ k tomu souboru.
Až se to tam zastaví, otevři si evaluační konzoli a najdi správnou kombinaci, pomocí které přistoupíš k tomu souboru :)

Nahoru Odpovědět 11.12.2018 17:38
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Navry
Petr Štechmüller:11.12.2018 17:49

Mimochodem, mě to docela pěkně funguje...
Vytvořil jsem i artefakt a ten soubor to nalezlo

Nahoru Odpovědět 11.12.2018 17:49
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Navry
Člen
Avatar
Odpovídá na Petr Štechmüller
Navry:11.12.2018 19:36

Na tom obrázku máš soubor i třídu ve složce src, já mám soubor ve složce res.

Struktura projektu:
src/balicek/.­../Trida.java
res/Soubor

 
Nahoru Odpovědět 11.12.2018 19:36
Avatar
Petr Štechmüller
Překladatel
Avatar
Petr Štechmüller:11.12.2018 19:37

Podíval jsem se do JARu a tam je ten soubor přímo v kořeni toho JARu, není v žádný složce.

Nahoru Odpovědět 11.12.2018 19:37
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Navry
Člen
Avatar
Odpovídá na Petr Štechmüller
Navry:12.12.2018 10:57

Tak jsem dal místo

String fileName =  resource.getFile()

tohle

String fileName =  resource.toURI().getPath();

A funguje to při spuštění v IDEI. Protože mám v názvech složek mezery a resource.getFile() je nahradí pomocí %20. Pomocí resource.toURI()­.getPath() se tam dají zas ty mezery a cesta je správná a FileReader nemá problém.

Bohužel to zase nefunguje při spuštění JARu. :-( A problém je asi v tom, že při spuštění JARu je v cestě k tomu souboru (při zavolání getResource()) "NazevJaru.jar!/Sou­bor" a s tím vykřičníkem si resource.toURI()­.getPath() neporadí a vrací null?

Já chci prostě nějakej normání způsob, kterej bude fungovat jak v IDE tak ve výsledném programu...

 
Nahoru Odpovědět 12.12.2018 10:57
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Navry
Petr Štechmüller:12.12.2018 16:42

Ahoj, nevím, co děláš za divočárny, ale zkus toto:

assert getClass().getResource("soubor.txt") != null;
assert Paths.get(getClass().getResource("soubor.txt").toExternalForm()).toFile().exists();

Pokusil jsem se i napodobit tvoji strukturu projektu a stále mi to funguje...
Přikládám screenshot projektu, kodu i obsahu toho JARka

Nahoru Odpovědět 12.12.2018 16:42
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
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 9 zpráv z 9.