Datei einlesen funktioniert nicht

  • Themenstarter Themenstarter FranzFerdinand
  • Beginndatum Beginndatum
F

FranzFerdinand

Gast
Hallöle,

ich beschäftige mich mit dem Einlesen und Speichern von Textdateien in Form von Properties.
Ich habe die angegebene Ordnerstruktur in Eclipse:
Bildschirmfoto 2015-05-13 um 18.16.25.png

Im resources Ordner "dateien" liegt meine Textdatei namens "spielstand.txt".

Diese möchte ich gerne einlesen und in ihr Dinge abspeichern:

Hierzu habe ich mir die EinleseMethode gebastelt:
Java:
private Properties ladeProperties(String filename) {
		Properties prop = new Properties();
		InputStream inputStream = getClass().getClassLoader().getResourceAsStream("./dateien/"+filename);
		try {
			prop.load(inputStream);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return prop;
	 }

Ich lese das dann in einer anderen Methode ein mit:
Java:
Properties spielstand = ladeProperties("spielstand.txt");

Ich bekomme jedoch stetig eine NullPointerException in genau dieser Zeile heraus, die Datei spielstand.txt würde nicht existieren.
Gleichzeitig legt Eclipse auf einmal eine gleichnamige Datei im Root Verzeichnis neu an.

Kann mir jemand verraten, was ich falsch mache beim Aufruf der Datei?

Ich habe schon sehr viel Umherexperimentiert und kurzfristig eine funktionierende Lösung gehabt, die aber dann beim Exportieren in eine JAR wieder nicht ging, also nur in Eclipse.

Es wäre sehr schön, wenn mir jemand sagen könnte, wie ich erreiche, dass das einlesen und speichern in Eclipse und von einer jar aus (die Textdatei ist innen drin in dieser) funktioniert.

Schöne Grüße und Danke
Lukas 🙂
 
Hallöle, und danke für Deine Antwort,

damit hat es leider auch nicht funktioniert.

Aber jetzt klappt es irgendwie halbwegs auf anderem Wege.

Ich zeige mal die gesamte Javaklasse:
Java:
package cafeint;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.net.URL;
import java.util.Properties;

import javax.swing.JOptionPane;

public class Spielstand {
	
	private String dateiname = "spielstand.txt";
	
	public void speichern() {
		Properties spielstand = ladeProperties(dateiname);
		spielstand.setProperty("spielangefangen",String.valueOf(true));
		spielstand.setProperty("amZug",String.valueOf(Variablen.getAktSpieler()));
		spielstand.setProperty("zustand",String.valueOf(Variablen.getZustand()));
		
		for(int i=0;i<2;i++) {
			spielstand.setProperty("spielername"+i,Variablen.getSpieler(i).getName());
			spielstand.setProperty("spielerpunkte"+i,String.valueOf(Variablen.getSpieler(i).getPunkte()));
			for(int h=0;h<5;h++) {
				spielstand.setProperty("handkarte"+i+"-"+h,String.valueOf(Variablen.getSpieler(i).getHandkarten().get(h)));
			}
		}
		spielstand.setProperty("anzahlGastkarten",String.valueOf(Variablen.getGastkarten().size()));
		spielstand.setProperty("anzahlLaenderkarten",String.valueOf(Variablen.getLaenderkarten().size()));
		spielstand.setProperty("anzahlBarkarten",String.valueOf(Variablen.getBarkarten().size()));
		for(int i=0;i<Variablen.getGastkarten().size();i++) {
			spielstand.setProperty("gastkarte"+i,String.valueOf(Variablen.getGastkarten().get(i)));
		}
		for(int i=0;i<Variablen.getLaenderkarten().size();i++) {
			spielstand.setProperty("laenderkarte"+i,String.valueOf(Variablen.getLaenderkarten().get(i)));
		}
		for(int i=0;i<Variablen.getBarkarten().size();i++) {
			spielstand.setProperty("barkarte"+i,String.valueOf(Variablen.getBarkarten().get(i)));
		}
		for(int i=0;i<Variablen.getStuehle().size();i++) {
			spielstand.setProperty("stuhl"+i,String.valueOf(Variablen.getStuehle().get(i).getGast()));
		}
		for(int i=0;i<Variablen.getTische().size();i++) {
			spielstand.setProperty("tisch"+i,String.valueOf(Variablen.getTische().get(i).getLaenderkarte()));
		}
		
		try {
			spielstand.store(new FileWriter("dateien/"+dateiname),"Spielstand gespeichert");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public void laden() {
		Properties spielstand = ladeProperties(dateiname);
		boolean spielgespeichert = Boolean.valueOf(spielstand.getProperty("spielangefangen","false"));
		if(spielgespeichert) {
			Meldungen msgbox = new Meldungen();
			int menue = JOptionPane.showOptionDialog(null,msgbox.altesspielfrage,msgbox.altesspieltitel, JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, msgbox.altesspieloptionen, msgbox.altesspieloptionen[0]);
            if(menue == 0) {
            	Variablen.setAktSpieler(Integer.valueOf(spielstand.getProperty("amZug")));
    			Variablen.setZustand(Integer.valueOf(spielstand.getProperty("zustand")));
    			for(int i=0;i<2;i++) {
    				Variablen.getSpieler(i).setName(spielstand.getProperty("spielername"+i));
    				Variablen.getSpieler(i).setPunkte(Integer.valueOf(spielstand.getProperty("spielerpunkte"+i)));
    				for(int h=0;h<5;h++) {
    					Variablen.getSpieler(i).getHandkarten().add(Gastkarte.parseGastkarte(spielstand.getProperty("handkarte"+i+"-"+h)));
    				}
    			}
    			Programmstart progst = new Programmstart();
    			progst.grafikladen();
    			Statistikecke.getInfz(0).punktzahlschreiben();
    			Statistikecke.getInfz(1).punktzahlschreiben();
    			Statistikecke.getInfz(Variablen.getAktSpieler()).faerben(true);
    			int anzahlGastkarten = Integer.valueOf(spielstand.getProperty("anzahlGastkarten"));
    			int anzahlLaenderkarten = Integer.valueOf(spielstand.getProperty("anzahlLaenderkarten"));
    			int anzahlBarkarten = Integer.valueOf(spielstand.getProperty("anzahlBarkarten"));
    			for(int i=0;i<anzahlGastkarten;i++) {
    				Variablen.getGastkarten().add(Gastkarte.parseGastkarte(spielstand.getProperty("gastkarte"+i)));
    			}
    			for(int i=0;i<anzahlLaenderkarten;i++) {
    				Variablen.getLaenderkarten().add(Laenderkarte.parseLaenderkarte(spielstand.getProperty("laenderkarte"+i)));
    			}
    			for(int i=0;i<anzahlBarkarten;i++) {
    				Variablen.getBarkarten().add(Gastkarte.parseGastkarte(spielstand.getProperty("barkarte"+i)));
    				Barkartenecke.getBarzelle(i).setGast(Variablen.getBarkarten().get(i));
    			}
    			for(int i=0;i<Variablen.getStuehle().size();i++) {
    				Variablen.getStuehle().get(i).setStartGast(Gastkarte.parseGastkarte(spielstand.getProperty("stuhl"+i)));
    			}
    			for(int i=0;i<Variablen.getTische().size();i++) {
    				Variablen.getTische().get(i).setLand(Laenderkarte.parseLaenderkarte(spielstand.getProperty("tisch"+i)));
    			}
            } else {
            	neuesspiel();
            }
		} else {
			neuesspiel();
		}
	}
	
	private void neuesspiel() {
		Programmstart progst = new Programmstart();
		Spielstart spstart = new Spielstart();
		progst.namensfrage();
        progst.grafikladen();
        spstart.neuesspiel();
	}
	
	public void loescheSpielstand() {
		Properties spielstand = ladeProperties(dateiname);
		spielstand.clear();
		spielstand.setProperty("spielangefangen",String.valueOf(false));
		
		try {
			spielstand.store(new FileWriter("dateien/"+dateiname),"Spielstand gespeichert");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private Properties ladeProperties(String filename) {
		Properties prop = new Properties();
		InputStream inputStream = getClass().getClassLoader().getResourceAsStream(filename);
		try {
			prop.load(inputStream);
			inputStream.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return prop;
	 }

}

Die ganzen Elemente drum herum sind nicht so wichtig, da lade und speichere ich einzelne Variablen aus anderen Klassen. Insofern er die Datei selbst hinkriegt zu speichern, dann geht das auch. 😉
Also ich rufe die Properties stets in der Methode ladeProperties auf und in den anderen Methoden speichere ich dran herum.

In Eclipse allein klappt das nun sehr gut.
Auch wenn ich es als Jar Exportiere, lädt er die Spieldaten aus der txt heraus. Die txt liegt aber in der Jar drin.
Er speichert aber keine Spielstände drin ab.
Kann er das überhaupt von txt Dateien innerhalb von Jar Dateien?
Wenn Nein: Wie kan ich da anders lösen?

Kann mir einer anhand meines Quelltextes erklären, was da nicht funktioniert?

Vielen Dank!
Gruß
Lukas 🙂
 
Hi,
Kann er das überhaupt von txt Dateien innerhalb von Jar Dateien?
Bist du sicher, dass die Datei: spielstand.txt ins jar gepackt wird?
(das kannst du sehen wenn du das jar mit 7zip öffnest)

Wenn spielstand.txt im jar ist, dann geht das nicht. Denn das jar müsste bei jeder Änderung in spielstand.txt entpackt und dann neu erstellt werden, und das während der Zeit, in der das jar selbst ausgeführt wird.
Ist die Datei Schreibgeschützt?

Wie hast du den Export als jar gemacht?

Wenn Nein: Wie kan ich da anders lösen?
Hast du folgendes schon geprüft:
Wenn du das jar erstellst, und exportierst, dann muss du noch einen Ordner dateien mit der Datei spielstand.txt im selben Verzeichnis haben, wo das jar ist.
 
Zuletzt bearbeitet:

Zurück
Oben