Objekte speichern mit JFileChooser

wyldstyle

Aktives Mitglied
Hi, ich versuche grad mein Programm etwas 'aufzupeppen'. Das Programm beinhaltet eine Speicherfunktion welches einfach das komplette Programm über Serialisierung speichert. Bisher wird dazu einfach eine Datei im selebn Verezcihnis abgelegt, indem auch das Programm (jar) liegt.
Ich wollte das ganze jetzt so abändern, dass man auswählen kann wo man die Datei speichern möchte.
Ich nutze dazu den JFileChooser aber ich denke ich habe einen Logikfehler im Code.

Bisher lief die Speicherung mit:
Code:
datenStrom = new FileOutputStream(datum);
				objektStrom = new ObjectOutputStream(datenStrom);
				objektStrom.writeObject(this);


Angenommen der Nutzer wählt jetzt einen Zielornder aus - und klickt auf 'speichern' ...
wie bekomme ich den objektStrom dazu, die Datei genau unter dem Pfad abzulegen?

So sieht der Code bisher aus:

Code:
private void erstellespeichernDialog() {
		FileOutputStream datenStrom;
		ObjectOutputStream objektStrom;
		tischneuzeichnen();
		System.out.println("Speichervorgang starten");
		Date date = new Date();
		String datum = date.toString()+".codeem";
		datum = datum.replaceAll(" ", "");
		datum = datum.replaceAll(":", ".");
		datum = datum.replaceAll("CEST", "");
		
		
		String name;
		speicherauswahl.setDialogTitle(" Wo m\u00F6chtest du speichern?");
		speicherauswahl.setFileFilter(new FileFilter() {
			@Override
			public boolean accept(File f) {
				return f.isDirectory()
						|| f.getName().toLowerCase().endsWith(".codeem");
			}
			@Override
			public String getDescription() {
				return "Texas Code'em Speicherst\u00E4nde";
			}
		});
		
		int zustand = speicherauswahl.showSaveDialog(null);
		speicherauswahl.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
		speicherauswahl.getCurrentDirectory();
		if (zustand == JFileChooser.APPROVE_OPTION) {
			try{
				datenStrom = new FileOutputStream(datum);
				objektStrom = new ObjectOutputStream(datenStrom);
				objektStrom.writeObject(this);
				objektStrom.close();
				// tisch.setSpielverlauf("Speicherstand "+ datum +" angelegt.");
			}catch (Exception e){
				System.out.println("Fehler beim Speichervorgang, ABBRUCH");
				e.printStackTrace();
			}
		}

	}

Ich denke nicht, dass das Problem sonderlich komplex ist aber wie immer - bekomm ichs irgendwie nicht hin, hoffe ihr könnt mir da n Hinweis geben!

Grüße,

wyldstyle
 
getSelectedFile ?
p.s: So Datums-Strings muss man nicht per Hand selbst zusammenbasteln:
Java:
	SimpleDateFormat sdf = new SimpleDateFormat("EMMMddHH.mm.ss");
	System.out.println(sdf.format(new Date()));
/edit: ach du willst nur dne Ordner auswählen, naja, dann ignoriere den Rest 😀
Wenn du das Datum weiterhin hinzufügen willst, musst du halt ein neues File-Objekt erstellen und das Datum dran hängen.

FileOutputStream hat dann auch diesen Konstruktor: FileOutputStream (Java Platform SE 6)
 
Zuletzt bearbeitet:
Steig da nicht durch - liefert mir getSelectedFile nen Pfad zurück? Und wenn ja - wie weise ich den Outputstream an in das Verzeichnis zu schreiben!?
 
Also ich bin da bei dir gerade selbst etwas durcheinander gekommen, denn dein Filter, in Zusammenhang mit setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); ist etwas merkwürdig..aber okay...

Also so wie ich dich nun verstandne habe, suchst du in etwa so etwas:
(Beispiel ohne gewähr *g*)
Java:
	public static void main(String[] args) throws Exception {
		SimpleDateFormat sdf = new SimpleDateFormat("EMMMddHH.mm.ss");
		JFileChooser chooser = new JFileChooser();
		chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
		chooser.showOpenDialog(null);
		File f = chooser.getSelectedFile();
		f = new File(f.getAbsolutePath() + File.separatorChar
				+ sdf.format(new Date()) + ".codeem");
		datenStrom = new FileOutputStream(f);
		//.....
	}
 
Noch nicht ganz - geht aber in die korrekte Richtung.

Ich hatte es jetzt mal so versucht:

Java:
                FileOutputStream datenStrom;
                ObjectOutputStream objektStrom;
	        SimpleDateFormat sdf = new SimpleDateFormat("EMMMddHH.mm.ss");
	        JFileChooser chooser = new JFileChooser();
	        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
	        chooser.showOpenDialog(null);
	        File f = chooser.getSelectedFile();
	        f = new File(f.getAbsolutePath() + File.separatorChar
	                + sdf.format(new Date()) + ".codeem");
	        try {
	        	 datenStrom = new FileOutputStream(f);
	        	 objektStrom = new ObjectOutputStream(datenStrom);
				 objektStrom.writeObject(this);
				 objektStrom.close();
				 tisch.setSpielverlauf("Speicherstand "+ sdf +" angelegt.");
	        }catch (Exception e){
	        	System.out.println("Fehler beim Speichervorgang, ABBRUCH");
				e.printStackTrace();
	        }

Ich will halt das aktuelle Objekt speichern - nichts laden. Also quasi dem datenstrom sagen wohin das ganze gehen soll ( in das verzeichnis was im Filechooser gewählt wurde).

Ich find den FileChooser irgendwie verwirrend!
 
Zuletzt bearbeitet:
Ich will halt das aktuelle Objekt speichern - nichts laden. Also quasi dem datenstrom sagen wohin das ganze gehen soll ( in das verzeichnis was im Filechooser gewählt wurde).

also jetzt kann ich dir gar nicht mehr folgen...wo wird da etwas geladen? Und was genau geht jetzt an dem Code nicht? :autsch:
Der FileChooser an sich hat nichts mit Speichern oder ähnliches zu tun, der macht quasi nichts, ausser so wie der Name schon sagt, einen Auswahldialog zur Verfügung zu stellen damit der Benutzer eine Datei/Ordner auswählen kann, sonst nichts! Ums Speichern und laden musst du dich selber kümmern...(und das macht doch der Code oben oder etwa nicht? )
 
Hi, ja es klapt mittlerweile soweit, allerdings ist da noch eine Kleinigkeit. Kann man das Feld wo man 'Dateiname' eingibt, irgendwie deaktivieren? Da kann man sonst irgendwas sinnloses eingeben und bekommt dann ne exception!
 

Neue Themen


Zurück
Oben