Kann den angegebenen Pfad nicht finden - Java?

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

Woher ich das weiß:Berufserfahrung – Freiberuflicher Java Entwickler mit 10 Jahren Erfahrung
andi3366 
Fragesteller
 10.02.2019, 15:24

Die Datei liegt in der .jar unter resources

0
Xearox  10.02.2019, 15:38
@andi3366

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();
}

0
andi3366 
Fragesteller
 10.02.2019, 15:47
@Xearox

Was ist file? Bei new JarFile(file) und nach stream = jar.getInputStream(entry); kommt insert Finally?

0
andi3366 
Fragesteller
 10.02.2019, 15:51
@andi3366

Was ist file bei new JarFile(file)? Und nach stream = jar.getInputStream(entry); kommt insert Finally?*

0
andi3366 
Fragesteller
 10.02.2019, 15:28

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?

0
Xearox  10.02.2019, 15:58
@andi3366

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.

GSON: https://github.com/google/gson

0
andi3366 
Fragesteller
 10.02.2019, 16:01
@Xearox

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?

0
Xearox  10.02.2019, 16:03
@andi3366

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.

1
andi3366 
Fragesteller
 10.02.2019, 16:05
@Xearox

Okay, also eine JSON funktioniert auch gut, wenn ich die Einstellungen des Users speichern will? z.B. startAgain = true; centerText = flase; textSize = 10

0
Xearox  10.02.2019, 16:07
@andi3366

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.

1
andi3366 
Fragesteller
 10.02.2019, 16:09
@Xearox

Kann ich die JSON in resources abspeichern? Ist das egal wo, solange sie in der jar verpackt ist?

0
Xearox  10.02.2019, 16:50
@Xearox

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
#################################################
1
Xearox  11.02.2019, 03:36
@andi3366

Hast du ausprobiert? Klappt mein Beispiel Projekt?

0