Pristup k suboru v JAR

Sekcia o programovaní, programovacích jazykoch...
Používateľov profilový obrázok
materik
Používateľ
Používateľ
Príspevky: 2257
Dátum registrácie: Št 10. Apr, 2008, 14:00
Bydlisko: Prešov

Pristup k suboru v JAR

Príspevok od používateľa materik »

mam exportnute jar-ko s nasledujucou strukturou:

Kód: Vybrať všetko

xxx.JAR
|- MyConnectors (folder)
   |- connector.class
|- Utility (folder)
   |- 3 utility classy
|- XmlDatasources (folder)
   |-  data.xml
Potrebujem sa priamo na serveri dostat k suboru data.xml a precitat si ho, no nedokazem ho nacitat.
Pri debuggu som zistil, ze oba tieto sposoby mi is vratia ako null.

Kód: Vybrať všetko

InputStream is = this.getClass().getResourceAsStream("..\XmlDatasources\data.xml"); 
InputStream is = this.getClass().getResourceAsStream(".data.xml");
Viete nieco poradit? Neviem sa s tym pohnut a uz zacinam byt :furious:
PC -> Topping E30 -> Topping L30 -> Beyerdynamic Amiron Home / Microlab B77
Používateľov profilový obrázok
filuS
Používateľ
Používateľ
Príspevky: 548
Dátum registrácie: Ut 26. Aug, 2008, 13:14
Bydlisko: Presov, Slovakia

Re: Pristup k suboru v JAR

Príspevok od používateľa filuS »

V tom druhom priklade mas chybu - za zaciatocnou bodkou Ti chyba lomitko.

Mozes skusit nieco taketo:

Kód: Vybrať všetko

InputStream configStream = getClass().getResourceAsStream("XmlDatasources/data.xml");
BufferedReader configReader = new BufferedReader(new InputStreamReader(configStream, "UTF-8"));
Alebo - pokial viem, tak jar-ka su v podstate obycajne .zip subory, cize mozes to skusit otvorit ako zip a citat obsah. Ale to nie je boh-vie-ako pekny pristup.
Desktop
Spoiler: ukázať
Specs:
- AMD Ryzen 5 5600X + Noctua NH-U12S Chromax.black
- PowerColor Red Devil AMD Radeon RX 6700XT
- ASUS TUF Gaming B550M-PLUS
- Crucial Ballistix 32GB (4x8GB) 3600 MHz CL16
- Be Quiet! Pure Base 500DX Black + 5x Noctua fans
- Corsair RM650x + CableMod PRO ModMesh C-Series Kabel Kit (Black/Red)
- Samsung 970 EVO Plus 500GB + ADATA XPG SX8200 Pro 1TB
- Sound Blaster Z
OS: Windows 10 Home 64bit
Monitor: Zowie by BenQ XL2546K + Eizo FS2333
Peripherals:
- Logitech G PRO Superlight + Artisan Hien L Mid Wine Red
- Logitech G915 TKL (red)
- Audio-Technica ATH-G1WL
Používateľov profilový obrázok
materik
Používateľ
Používateľ
Príspevky: 2257
Dátum registrácie: Št 10. Apr, 2008, 14:00
Bydlisko: Prešov

Re: Pristup k suboru v JAR

Príspevok od používateľa materik »

hm, nic... skusal som rozne cesty a nejde to :?
Neviem sa ale dopatrat, ci taketo jar-ko nepotrebuje nejake speci nastavenia pri exporte?
Pouzivam len default nastavenie eclipsu + pridavam potrebne subory/priecinky.
PC -> Topping E30 -> Topping L30 -> Beyerdynamic Amiron Home / Microlab B77
faugusztin
Moderátor
Moderátor
Príspevky: 15049
Dátum registrácie: Ut 26. Feb, 2008, 14:00
Bydlisko: Bratislava/Štúrovo

Re: Pristup k suboru v JAR

Príspevok od používateľa faugusztin »

Kód: Vybrať všetko

InputStream is = this.getClass().getResourceAsStream("/XmlDatasources/data.xml"); 
Cesty zapisujes relativne k rootu. A spatne lomitka sa v Jave na cesty nepouzivaju.
Používateľov profilový obrázok
materik
Používateľ
Používateľ
Príspevky: 2257
Dátum registrácie: Št 10. Apr, 2008, 14:00
Bydlisko: Prešov

Re: Pristup k suboru v JAR

Príspevok od používateľa materik »

dikes, konecne to ide :good:
mal som v kode 5 roznych variant cesty k suboru ale ten tvoj som tam akurat nedal... :facepalm:
PC -> Topping E30 -> Topping L30 -> Beyerdynamic Amiron Home / Microlab B77
Používateľov profilový obrázok
materik
Používateľ
Používateľ
Príspevky: 2257
Dátum registrácie: Št 10. Apr, 2008, 14:00
Bydlisko: Prešov

Re: Pristup k suboru v JAR

Príspevok od používateľa materik »

mam este otazku:
Je cesta k nejakemu suboru zavisla od cesty class-y, z ktorej volam getResourcesAsStream?
Ak som na nacitanie data.xml pouzil sposob ako uviedol faugusztin, tak mi to islo bez problemov.
Ak pouzijem dany sposob na nacitanie obrazku, tak to nejde... :? Rozdiel je ale v strukture jar-ka

Kód: Vybrať všetko

Struktura v ramci jar:
\com\studio\forms\xxx.class // classa v ktorej chcem nacitat obrazok
\img\icoDesc.png

Volanie v kode xxx.class:
InputStream stream = this.getClass().getResourceAsStream("\img\icoDesc.png");
toto mi vrati stream ako null :?: Neviem ako tu cestu nacitat a pravdu povediac, neviem ci vlastne rozumiem tomu,
ako getResourceAsStream v ramci jar-ka funguje.
PC -> Topping E30 -> Topping L30 -> Beyerdynamic Amiron Home / Microlab B77
faugusztin
Moderátor
Moderátor
Príspevky: 15049
Dátum registrácie: Ut 26. Feb, 2008, 14:00
Bydlisko: Bratislava/Štúrovo

Re: Pristup k suboru v JAR

Príspevok od používateľa faugusztin »

Prestan pouzivat blbe Windows spatne lomitka. Java nic take nepozna!!!

Kód: Vybrať všetko

InputStream stream = this.getClass().getResourceAsStream("/img/icoDesc.png");
Struktura je takato :
/com/studio/forms/xxx.class
/img/icoDesc.png

Java nie je Windows. Jedine Windows pouziva ako oddelovac nazvu suborov \, v jave sa vsade pouziva /. Okrem toho v retazci by si aj tak musel uvadzat \\, lebo \ je escape znak pre rozne znakove konstanty.
Používateľov profilový obrázok
materik
Používateľ
Používateľ
Príspevky: 2257
Dátum registrácie: Št 10. Apr, 2008, 14:00
Bydlisko: Prešov

Re: Pristup k suboru v JAR

Príspevok od používateľa materik »

sorac, to som len zle napisal :red: V kode to mam ako to ma byt.
Inac, tento sposob by mal fungovat aj ked jar nie je build-nute? Teda, spustene ako aplikacia v Eclips-e.
PC -> Topping E30 -> Topping L30 -> Beyerdynamic Amiron Home / Microlab B77
faugusztin
Moderátor
Moderátor
Príspevky: 15049
Dátum registrácie: Ut 26. Feb, 2008, 14:00
Bydlisko: Bratislava/Štúrovo

Re: Pristup k suboru v JAR

Príspevok od používateľa faugusztin »

Ano, ono to hlada v classpath. Samozrejme aj ten img adresar musi byt v classpath.
Používateľov profilový obrázok
materik
Používateľ
Používateľ
Príspevky: 2257
Dátum registrácie: Št 10. Apr, 2008, 14:00
Bydlisko: Prešov

Re: Pristup k suboru v JAR

Príspevok od používateľa materik »

Kód: Vybrať všetko

		InputStream stream = this.getClass().getResourceAsStream("/img/icoDesc.png");
		URL url = this.getClass().getResource("/img/icoDesc.png");
		
		if(stream != null){
			Image imgDesc = new Image(this.getShell().getDisplay(), stream);
			setDefaultPageImageDescriptor(ImageDescriptor.createFromImage(imgDesc));
		}
		
		if(url != null){
			Image imgDesc = new Image(this.getShell().getDisplay(), url.toString());
			setDefaultPageImageDescriptor(ImageDescriptor.createFromImage(imgDesc));
		}
		
		setDefaultPageImageDescriptor(ImageDescriptor.createFromFile(null, "img/icoDesc.png"));
hm, ja uz neviem... ak pouzijeme tento kod, tak jedine posledny riadok mi nastavi descriptor tak ako chcem... Samozrejme len v eclipse, v jarku nejde nic :smutny:
Bud som velmi zblbnuty C#-om alebo som nieco absolutne nepochopil... :?
PC -> Topping E30 -> Topping L30 -> Beyerdynamic Amiron Home / Microlab B77
faugusztin
Moderátor
Moderátor
Príspevky: 15049
Dátum registrácie: Ut 26. Feb, 2008, 14:00
Bydlisko: Bratislava/Štúrovo

Re: Pristup k suboru v JAR

Príspevok od používateľa faugusztin »

Fungovat to musi.
Eclipse projekt : https://googledrive.com/host/0B9E7uLESL ... roject.zip
JAR subor zodpovedajuci projektu : https://googledrive.com/host/0B9E7uLESL ... roject.jar

Obe vypisu :

Kód: Vybrať všetko

Zostavajuci pocet bytov v streame : 11711
Ale nie som si isty, ze to pouzivas spravne ty, myslim tie Eclipse triedy. Konstruktor Image(Device device, InputStream stream) podla mna ako stream predpokladan serializovanu podobu Image objektu, a nie obrazok. Na nacitanie obrazku z JPEG/PNG atd sluzi podla mna org.eclipse.swt.graphics.ImageLoader, presnejsie metoda load(InputStream stream), ktora vrati ImageData[], ktore mozes nasledne pouzit v konstruktore Image(Device device, ImageData data).
Používateľov profilový obrázok
materik
Používateľ
Používateľ
Príspevky: 2257
Dátum registrácie: Št 10. Apr, 2008, 14:00
Bydlisko: Prešov

Re: Pristup k suboru v JAR

Príspevok od používateľa materik »

hm, neviem povedat ci je lepsie pouzivat konstruktor s ImageData[]. Problem je v tom, ze aj tak potrebujem InputStream a prave ten stale dostavam null.
Nic, kaslam zatial na to, mam este iny s**t na vyriesenie... ak na nieco pridem, tak to tu hodim.

Jo a diky za pripomenutie tych lomitok :good:, mal som na dvoch miestach v kode skladanie cesty (priecinok + meno suboru) a prave tam by sa to zdrbalo. Takze File.separator

Kód: Vybrať všetko

this.schemaPath = folderPath + File.separator + this.connId + ".xsd";
PC -> Topping E30 -> Topping L30 -> Beyerdynamic Amiron Home / Microlab B77
faugusztin
Moderátor
Moderátor
Príspevky: 15049
Dátum registrácie: Ut 26. Feb, 2008, 14:00
Bydlisko: Bratislava/Štúrovo

Re: Pristup k suboru v JAR

Príspevok od používateľa faugusztin »

Tie linky ti davaju priamo projekt a JAR subor, kde to funguje, skus sa nan pozriet a zistit kde robis chybu. Podla mna proste nemas ten img adresar v classpath.
Používateľov profilový obrázok
materik
Používateľ
Používateľ
Príspevky: 2257
Dátum registrácie: Št 10. Apr, 2008, 14:00
Bydlisko: Prešov

Re: Pristup k suboru v JAR

Príspevok od používateľa materik »

tak nakoniec to ide a problem bol niekde medzi TFS a Mavenom, netusim kde :-)
Totiz po komplexnom odmazani projektov, getnuti poslednej verzie a update/clean/build maven projektov mi to konecne funguje. Neviem co presne to sposobovalo, ale ocividne som nieco nemal korektne nastavene... Tento sposob teda ide:

Kód: Vybrať všetko

InputStream stream = this.getClass().getResourceAsStream("/img/icoDesc.png");
if(stream != null){
	ImageData imgData = new ImageData(stream);
	setDefaultPageImageDescriptor(ImageDescriptor.createFromImageData(imgData));
}
ImageData som nakoniec pouzil preto, ze nepotrebuje v konstruktore Device, takze je tam menej moznosti na zdrbanie sa.
Dikes faugusztin za pomoc :good:

EDIT:
Nedalo mi to spat, chyba bola v sposobena mapingom priecinkov a dvoma odlisnymi workspace-mi. Doslo k zaujimavemu mis-masu a maven potom buildoval veci inam ako bolo v eclipse viditelne. :facepalm: Cudne, ze za cely cas co som fungoval v tak rozbitom prostredi (cca 2-3 dni), mi to nezahucalo nikde inde...
PC -> Topping E30 -> Topping L30 -> Beyerdynamic Amiron Home / Microlab B77

Návrat na "Programovanie"