Problem mit dem Lesen einer projektinternen .csv aus der runnable JAR

MarcoZ.

Neues Mitglied
Hallo. Ich habe das Problem, das ich als Teil meines Codes eine bzw. zwei Methoden habe, welche die Daten aus CSV Dateien lesen sollen, welche sich in der Projektstruktur befinden (siehe Bild) und später auch in der runnable JAR bleiben sollen. Diese Daten werden dann später im Programm genutzt um Geographische Namen zu referenzieren. Ich habe bereits das eine oder andere Debugging probiert. Es scheint als wird die Datei bei Programmstart aus Eclipse nicht gefunden oder bei der Übergabe vom InputStream zum Reader funktioniert etwas nicht. Ich habe auch schon einige andere Ordnerstrukturen verwendet um auf die Dateien zuzugreifen. Fällt jemandem was auf, wo der Fehler liegen könnte. Vielen Dank schon mal. Ich hoffe ich habe den Code richtig dargestellt (ist mein erster Beitrag).


Struktur.PNG

private void loadGeoNames() {

for (int i = 1; i <= 11; i++) {
String filePath = "GeoNames/GeoNames_part" + i + ".csv";
System.out.println("Versuche, Datei zu laden: " + filePath);

try (InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream(filePath)) {

if (inputStream == null) {
System.out.println("Ressource nicht gefunden: " + filePath);
JOptionPane.showMessageDialog(this, "GeoNames-Datei nicht gefunden: " + filePath);
continue;
}

try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
String line;
while ((line = reader.readLine()) != null) {
line = line.trim();


if (line.startsWith("geonameid")) {
continue;
}

String[] fields = line.split(";");

if (fields.length >= 12) {
try {
String city = fields[2].trim();
String country = fields[0].trim();
String latitudeStr = fields[9].trim().replace(",", ".");
String longitudeStr = fields[10].trim().replace(",", ".");

if (!latitudeStr.isEmpty() && !longitudeStr.isEmpty()) {
try {
double latitude = Double.parseDouble(latitudeStr);
double longitude = Double.parseDouble(longitudeStr);

geoNames.add(new GeoNameEntry(city, country, latitude, longitude));
} catch (NumberFormatException e) {

continue;
}
}
} catch (Exception e) {

continue;
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(this, "Fehler beim Laden der GeoNames-Datei " + filePath);
}
}
}

private void loadCountryCodes() {
String filePath = "GeoNames/CountryCode.CSV";

System.out.println("Versuche, Datei zu laden: " + filePath);

try (InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream(filePath)) {

if (inputStream == null) {
System.out.println("Ressource nicht gefunden: " + filePath);
JOptionPane.showMessageDialog(this, "CountryCode-Datei nicht gefunden: " + filePath);
return;
}

try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
String line;
while ((line = reader.readLine()) != null) {
line = line.trim();
if (line.startsWith("Country")) {
continue; // Überspringe die Kopfzeile
}

String[] fields = line.split(";");

if (fields.length >= 5) {
String countryCode = fields[0].trim();
String countryName = fields[4].trim();

countryCodes.put(countryCode, countryName);
}
}
}
} catch (IOException e) {
e.printStackTrace();
JOptionPane.showMessageDialog(this, "Fehler beim Laden der CountryCode-Datei " + filePath);
}
}
 

Anhänge

  • Struktur.PNG
    Struktur.PNG
    10,9 KB · Aufrufe: 0
Prüf bitte einmal, ob die Dateien wirklich im erstellten jar vorhanden sind. Vom Code her sieht es ansonsten ok aus. Ich hätte noch ein führenden / verwendet, aber da du den System ClassLoader verwendest sollte es so auch ok sein. (Bei getClass().getResourceAsStream wäre es notwendig).

Ansonsten noch der generelle Hinweis: Wenn Du Code postest, dann nutze bitte Code Tags. Das geht am einfachsten úber den Knopf </> links oberhalb des Eingabebereichs.
 
Vielen Dank für die Antwort und die Info Konrad! Das Problem ist, dass die Ausführung des Programms in Eclipse bereits Fehler wirft und daher abbricht. Die Datei kann nicht geladen werden. Die Ordner sind im Projekta als Source hinterlegt (build path etc.). Ich bin der Meinung ich habe mit der Variante schon alles probiert (auch mit / vorweg). Gibt es da noch eine andere Möglichkeit oder Fehlerquelle? Hat jemand vielleicht einen Beispiel-Code der auf eine „interne“ CSV o.ä. zugreift?
 
Ich arbeite in der Regel direkt mit getClass().getResourceAsStream wie Du auch etwas in https://www.java-forum.org/thema/background-bild-wird-in-exe-nicht-angezeigt.205246/ sehen kannst.

Aber der Weg über den ClassLoader sollte ebenso gehen.

Ansonsten bin ich absolut kein Fan von BuildIn Build Systemen. Damit limitierst Du Dich auf die IDE und mögliche Fehlersuchen sind erschwert. Hier sollte man eher auf Maven oder Gradle setzen wobei ich eher zu Maven neige. Dann ist man im „Mainstream“ und dann findet man eher Hilfe.

Das Bildschirmfoto zeigt mit dem Symbol, dass der resources Ordner als Sorce Ordner markiert ist. Daher müsste es ok sein. Evtl. kannst du Eclipse sagen, ein clean und Build all zu machen. Nur um sicher zu gehen, dass er alles gebaut hat. Oder schau mal, ob die Dateien alle richtig kopiert wurden. Out oder so heißt das Verzeichnis bei Eclipse meine ich (ich nutze Eclipse fast nie) und da müssen halt die .class Dateien liegen und die Ressourcen.
 

Zurück
Oben