FileNotFoundException durante la lettura del file XML da analizzare
-
24-09-2019 - |
Domanda
Sto scrivendo un programma in Java dove ho letto i dati da un file XML e analizzarlo. Il file viene importato in una cartella denominata "Risorse" nella directory src del mio progetto. Sto utilizzando Eclipse. Quando eseguo il programma, ottengo il seguente errore:
java.io.FileNotFoundException: /Users/thechiman/Dropbox/introcs/PSU SOC Crawler/resources/majors_xml_db.xml (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(FileInputStream.java:66)
...
Il codice di riferimento è qui:
private void parseXML() {
//Get a factory
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
//Use factory to get a new DocumentBuilder
DocumentBuilder db = dbf.newDocumentBuilder();
//Parse the XML file, get DOM representation
dom = db.parse("resources/majors_xml_db.xml");
} catch(ParserConfigurationException pce) {
pce.printStackTrace();
} catch(SAXException se) {
se.printStackTrace();
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
Non capisco perché sto ottenendo il FileNotFoundException quando il file è lì. Grazie per l'aiuto.
Soluzione
Con DocumentBuilder.parse(String)
, l'argomento viene interpretato come un URI, e in questo caso, sta andando ad essere un parente URI (la stringa si sta dando non è un 'pieno' URI). Che cosa è relativa a è un po 'ambigua, a questo punto, senza ulteriori informazioni sulla configurazione. Il runtime sarà interpretandolo come relative al qualcosa , ma non è chiaro che cosa qui che qualcosa è.
Si otterrà risultati più affidabili utilizzando uno degli altri metodi parse
, come ad esempio parse(File)
o parse(InputStream)
. In ogni caso, non c'è alcuna ambiguità su ciò che si sta chiedendo di analizzare.
Se si decide di costruire un oggetto File
prima (per passare a parse
dopo), allora avete un problema più gestibile di fare in modo che il file esiste (utilizzando File.exists()
e così via). Se non è possibile arrivare così lontano, quindi il problema non è con DocumentBuilder
o il DOM, è con i percorsi dei file di base. Ricordate che se si utilizzano percorsi di file relativi (ad esempio new File("resources/majors_xml_db.xml")
) allora questo sarà risolto relativo alla directory di lavoro del processo. Se funziona o no dipende da come si avvia il programma.