Portál AbcLinuxu, 13. května 2025 22:41
Dobry den, programuji projekt v Netbeans a zasekl jsem se na zdanlive malickosti. V programu pracuji s XML soubory a mam tedy tridu pro jejich nacitani a pro jejich dalsi zpracovani.
Jeste pred vysvetlenim problemu sem hodim strom projektu:
$ tree -d . |-- build | |-- classes | | `-- program | | |-- data | | |-- images | | `-- xml | `-- empty |-- nbproject | `-- private |-- src | `-- program | |-- data | |-- images | `-- xml `-- test
Co jsem se dival do automaticky generovaneho kodu obrazky ze slozky images se nacitaji takto:
jLabelSTARTER.setIcon(new javax.swing.ImageIcon(getClass().getResource("/program/images/start.PNG")));
Z toho jsem logicky usoudil, ze kontruktor me tridy pro praci s XML budu volat takto:
XMLworker xmlDoc = new XMLworker("/program/data/score.xml", "scoreboard");
Soubor score.xml ve slozce data SKUTECNE existuje, presvedcoval jsem se o tom snad 100x.
Vzdy vsak dostanu chybu
program.xml.XMLworkerException: Cannot load document: java.io.FileNotFoundException: /program/data/score.xml (No such file or directory) ...
Zkousel jsem tu cestu k souboru ruzne upravoval, ale bezvysledne
Pkud by vas nahodou zajimal i ten vlastni konstruktor:
public XMLworker(String uri, String topElement) throws XMLworkerException { try { DocumentBuilder builder=DocumentBuilderFactory.newInstance().newDocumentBuilder(); doc = builder.parse(uri); } catch (java.lang.Exception e) { throw new XMLworkerException("Cannot load document: "+e.toString()); } checkDocumentStructure(); test(); }
Foo().class.getResourceAsStream("data.txt");
Podmienkou je, aby data.txt a Foo.java boli v jednej package.
Tym nechcem tvrdit, ze to inak nejde, ale mne to takto staci a dalej to neriesim.
To reseni mi prijde trochu "pres ruku", ale budiz, s tim bych se smiril. Problem vsak je, ze v adresari data, kde je umisten soubor score.xml neni zadna trida...
Nevi prosim nekdo? Opravdu nutne bych to potreboval vyresit. Myslim, ze NetBeans je natolik rozsirene IDE, ze hodne lidi s necim podobnym muselo setkat...
vsimnul jste si rozdilu ve volani funkce getClass().getResource(string)? Parametrem teto funkce je cesta ktera se hleda v CLASSPATH, zatimco kdyz zavolate builder.parse(string) - tak se string povazuje za URI!! /nekde/neco je u me klasicka cesta v rootu. spravne by melo byt neco jako: jar:file:/.../foo.jar!/program/data/score.xml tedy to co dostanete kdyz zavolate getClass().getResource("/program/data/score.xml").toURI a to predate jako parametr, a nebo:
misto doc = builder.parse(uri); volat doc = builder.parse(getClass().getResourceAsStream(uri));
snad jsem se vyjadril dost jasne :)
Aha, dekuji, tuhle cast kodu jsem zkopiroval odsud (serial o XML na linuxsoft):
http://www.linuxsoft.cz/img/xml03/src/PhoneBookTableModel.java.html
tak jsem tomu veril...
java.lang.Class.getResource()
, případně obdobná metoda u třídy ClassLoader
.
V druhém případě se předává cesta k souboru na disku, dokumentaci hledejte u java.io.File
.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.