Kann den angegebenen Pfad nicht finden - Java?
Es wird in eine XML File geschrieben und diese dann ausgelesen. Ich habe anscheinend einen absoluten Pfad angegeben. Die Datei befindet sich in Projektverzeichnis/resources/userConfig.xml
In eclipse funktioniert alles, wenn ich das Projekt in eine .jar umwandle und irgendwo abspeichere jedoch nicht mehr.
Ich müsste irgendwie beim parsen .getResource verwenden aber ich weiß nicht wie.
Schreiben:
Lesen:
1 Antwort
Also soll die Datei in einem Ordner deine Wahl liegen?
Versuch mal das hier, um den Pfad der Datei zu bekommen.
String applicationDir = "";
try {
File file = new File(".");
applicationDir = file.getCanonicalPath();
} catch (Exception e) {
e.printStackTrace();
}
String pathToXML = applicationDir + File.separator + "resources" + File.separator + "userConfig.xml";
File file = new File("."); .... Holt sich den aktuellen Pfad, wo die jar liegt, also wo du diese ausgeführt hast, also wo diese liegt :D
Ganz ehrlich? Muss es wirklich XML sein? Mach es doch ganz einfach mit JSON und GSON.
Du erstellst dir eine Klasse, nennen wir sie mal UserConfig. Dort packst du alles rein, was du brauchst und anschließend machst du folgendes und das ist super easy :D
Datei Laden:
public Config loadConfigFile() throws IOException {
String path = Utils.getApplicationPath();
File configFile = new File(path + File.separator + "config.json");
if(!configFile.exists()) return null;
Gson gson = new Gson();
JsonReader reader = new JsonReader(new FileReader(configFile)); // ***
UserConfig config = gson.fromJson(reader, UserConfig.class);
return config;
}
Neue Datei erstellen:
public void createNewConfigFile() throws IOException {
String path = Utils.getApplicationPath();
File configFile = new File(path + File.separator + "config.json");
if(configFile.exists()) return;
UserConfig config = new UserConfig();
config.setUsername = "Irgend ein Name"
Writer writer = new FileWriter(configFile);
Gson gson = new GsonBuilder().setPrettyPrinting().create();
gson.toJson(config, writer);
writer.flush();
}
Letztere brauchst du eigentlich nur dann, wenn du die UserConfig.json noch nicht erstellt hast.
Hier noch die Methode für getApplicationPath
public String getApplicationPath() {
return new File(".").getCanonicalPath();
}
*** Wenn du statt eine externe Datei, einfach in der Jar die Datei verwenden willst, nutze folgendes
JsonReader reader = new JsonReader(new InputStreamReader(getClass().getResource("").openStream()));
Bei dieser Variante, brauchst du bei der Methode: loadConfigFile die ersten 3 Zeilen nicht mehr.
Warte, meinst du, dass ich mit dem Programm von außen eine XML Datei in einer anderen jar Datei auslesen will oder dass die jar Datei das Programm selbst ist mit der ich die XML Datei welche in dieser jar Datei liegt, auslesen will?
Das die Datei in der Jar liegt, ignoriere das mit JarFile einfach :D Hatte dich da falsch verstanden. Dachte, du wolltest in einer anderen Jar eine Datei auslesen.
Okay, also eine JSON funktioniert auch gut, wenn ich die Einstellungen des Users speichern will? z.B. startAgain = true; centerText = flase; textSize = 10
Ich arbeite eigentlich nur noch mit JSON, weil, wie ich finde, es super einfach ist, damit umzugehen.
Und GSON hat halt die Funktionalität, dass du ein Objekt komplett serialisieren kannst und in eine Datei schreiben kannst. Bzw. eine Datei in ein Objekt deserialisieren kannst. Und wenn du dann noch Listen und Maps verwendest, kannst du die Option "enableComplexMapKeySerialization()" verwenden beim GsonBuilder, um diese auch noch mit zu Serialisieren.
Kann ich die JSON in resources abspeichern? Ist das egal wo, solange sie in der jar verpackt ist?
Du kannst dir das Projekt hier runterladen: https://1drv.ms/u/s!AoH0G9wLuqHdh4UYA3qcH8oyWj1pGQ
Oder du schaust es dir hier an: https://gitlab.com/Xearox/gsonsampleproject
Wenn du die ZIP runtergeladen hast, musst du diese entpacken und folgendes beachten.
Wie du das Project in z.B. Eclipse einfügst:
File -> Import... -> Unter Maven wählst du "Existing Maven Projects" aus -> Wählst den Ordner aus und klickst auf Finish
Dann hast du das Maven Project hinzugefügt.
Wenn du das Programm ausgeführt hast, bekommst du folgendes ausgegeben.
Config in external directory
TextSize : 10
Start Again? : true
Centered Text? : false
#################################################
Config in internal resource directory
TextSize : 10
Start Again? : true
Centered Text? : false
#################################################
Versuch mal folgendes:
Reader:
JarFile jar = null;
InputStream stream = null;
try {
jar = new JarFile(file);
JarEntry entry = jar.getJarEntry("userConfig.xml");
if (entry == null) {
throw new FileNotFoundException("Jar does not contain userConfig.xml");
}
stream = jar.getInputStream(entry);
}
if(strean == null) return;
try {
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document document = dBuilder.parse(stream);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
Was ist file? Bei new JarFile(file) und nach stream = jar.getInputStream(entry); kommt insert Finally?
Warum wird die Datei eigentlich mit InputStream nicht auch gleich aktualisiert? Wenn ich mit InputStream versuche Daten aus der Datei auszulesen muss ich diese manuell refreshen damit InputStream nicht veraltete Daten ausliest?