NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Přístup ke složce v JAR souboru

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Petr Kraus
Člen
Avatar
Petr Kraus:20.1.2017 15:49

Ahoj, mam zapeklitý problém, potřebuji přistoupit k souborům v jar souboru. Neznáte nějaké rafinované řešení této problematiky?

 
Odpovědět
20.1.2017 15:49
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá na Petr Kraus
pocitac770:20.1.2017 18:31

Myslíš ve svém vlastním (aplikace), nebo v nějakém jiném, externím? A myslíš jako přes kód, a nebo jenom vidět a "upravovat", co je uvnitř? :D

 
Nahoru Odpovědět
20.1.2017 18:31
Avatar
Petr Kraus
Člen
Avatar
Odpovídá na pocitac770
Petr Kraus:20.1.2017 19:33

K souborům potřebuji ve své vlastní aplikaci přistoupit přes kód.

 
Nahoru Odpovědět
20.1.2017 19:33
Avatar
Atrament
Člen IT Redactor Gang
Avatar
Odpovídá na Petr Kraus
Atrament:21.1.2017 10:41

Není na tom nic zapeklitého ani rafinovaného. Řekněme, že chceš mít v jaru 'soubor.txt' ze kterého budeš chtít číst. Stačí když půjdeš do svého projektu, najdeš adresář src a v něm si vytvoř podadresář 'files'. Jméno si samozřejmě můžeš zvolit jiné.

Do něj nakopíruj 'soubor.txt'. Když dáš build tak se ten podadresář zkopíruje spolu s přeloženými třídami do adresáře 'build/classes' ve tvém projektu, který je základem pro obsah jar souboru. Soubor jar vlastně není nic jiného než ten adresář build/classes plus manifest.mf soubor zazipované dohromady.

Potom v kódu si z toho souboru uděláš input stream:

InputStream is = getClass().getResourceAsStream("/files/soubor.txt");

se kterým už můžeš dále pracovat normálně. Třeba pro čtení po řádcích získat BufferedReader:

BufferedReader br = new BufferedReader(new InputStreamReader(is));
 
Nahoru Odpovědět
21.1.2017 10:41
Avatar
Petr Kraus
Člen
Avatar
Petr Kraus:21.1.2017 12:32

Díky, funguje. Ale bohužel to neřeší můj problém, nenapsal jsem nic konkrétního - moje chyba. Mám složku se zvuky, které chci dynamicky získat a po kliknutí jeden náhodný přehrát.

 
Nahoru Odpovědět
21.1.2017 12:32
Avatar
Petr Kraus
Člen
Avatar
Odpovídá na Atrament
Petr Kraus:21.1.2017 12:45

Zapomněl jsem tě v odpovědi označit...

 
Nahoru Odpovědět
21.1.2017 12:45
Avatar
Atrament
Člen IT Redactor Gang
Avatar
Odpovídá na Petr Kraus
Atrament:21.1.2017 13:45

Princip je obvykle stejný, jakmile máš jednou InputStream, tak obvykle najdeš něco co si s tím bude rozumět. Například jednoduché přehrání zvuku v souboru sound.wav:

InputStream is = getClass().getResourceAsStream("/files/sound.wav");
AudioPlayer.player.start(is);
 
Nahoru Odpovědět
21.1.2017 13:45
Avatar
Petr Kraus
Člen
Avatar
Odpovídá na Atrament
Petr Kraus:21.1.2017 15:04

Jak můžu získat obsah celé složky, tak abych nemusel vypisovat názvy všech souborů ve složce?

 
Nahoru Odpovědět
21.1.2017 15:04
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá na Petr Kraus
pocitac770:21.1.2017 16:51

Myslel jsi něoc takového?

File file = new File("/sounds");
String[] sounds = file.list();
Random random = new Random();
String s = sounds[random.nextInt(sounds.length)];
//...... atd, viz výše
Editováno 21.1.2017 16:51
 
Nahoru Odpovědět
21.1.2017 16:51
Avatar
Petr Kraus
Člen
Avatar
Odpovídá na pocitac770
Petr Kraus:21.1.2017 17:14

Tohle řešení funguje, jenom když je složka "sounds" vedle jar souboru, já ji ovšem chci mít přímo v něm. Potom:

file.list()             //vrátí null
file.isDirectory()      //vrátí false
Editováno 21.1.2017 17:15
 
Nahoru Odpovědět
21.1.2017 17:14
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá na Petr Kraus
pocitac770:21.1.2017 17:48

Sry, trochu jsem pozapomněl...

File file = new File(getClass().getResource("/sounds").toString());

Tohle by už mělo jít

Editováno 21.1.2017 17:49
 
Nahoru Odpovědět
21.1.2017 17:48
Avatar
Petr Kraus
Člen
Avatar
Odpovídá na pocitac770
Petr Kraus:21.1.2017 18:04

Bohužel stále stejný problém...

 
Nahoru Odpovědět
21.1.2017 18:04
Avatar
Atrament
Člen IT Redactor Gang
Avatar
Atrament:22.1.2017 0:53

Vytvoř si InputStream z adresáře, ze kterého chceš vytáhnout seznam souborů,

InputStream is = getClass().getResourceAsStream("/files");

a tento InputStream čti pomocí BufferedReaderu, jak už jsem ukazoval výše, jako by to byl textový soubor - co řádek to název souboru v daném adresáři.

 
Nahoru Odpovědět
22.1.2017 0:53
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 13 zpráv z 13.