Sinnvolle Klassenhierachie zum Speichern von Dateien

Degget

Mitglied
Ich muss bei einer Aufgabe zum ersten mal eine Liste/Map in eine Datei schreiben und diese dann speichern. Quick and Dirty habe ich mir diese Methode dafür gemacht
Java:
	public static void speichereMapinTxt(String dateiname, Map map)
	{

		try
		{
			String writeString = "";
			BufferedWriter writer = new BufferedWriter(new FileWriter(dateiname + ".txt"));
			writer.write(writeString + map.toString());
			writer.close();
		} catch (IOException e)
		{
			e.printStackTrace();
		}

	}

Nun ist das eher eine Notlösung, weil der Abgabetermin der Aufgabe naht. Ich würde eigentlich lieber gleich eine vernünftige, wiederverwendbare Klassenhierachie (oder auch nur eine Klasse) schreiben, die mir gleich viele Methoden zum Speichern anbietet, die ich öfter benötigen werde. Da ich, wie gesagt, noch nicht viel mit dem Abspeichern zu tun hatte und nicht genau weiß, was dort nun wichtig ist, habe ich keine konkrete Idee für ein Konzept. Hat jemand für euch schon mal so etwas geschrieben und mag mir einen Ratschlag geben?
Danke
 

Atze

Top Contributor
hm, kommt ganz drauf an, was für methoden du da benötigst!? kann dir ja hier keiner sagen. geht es um verschiedene collections? was haben die verschiedenen methoden für (unterschiedliche) aufgaben? vielleicht kommst du auch mit serialisierung weiter!?
 

Degget

Mitglied
Sagen wir einfach mal, dass es darum geht, den Inhalt verschiedener Collections zu speichern.
Was wäre da ein guter Ausgangspunkt? Von meinem jetzigen Stand aus würde ich einfach zusätzlich
public static void speichereListinTxt(String dateiname, List list)
public static void speichereSetinTxt(String dateiname, Set Set)
public static void speichereMapinCsv(String dateiname, Map map)
.
.
.

Könnte man irgendwie eine Methode speichereCollectioninDatei schreiben, die allein durch ihre Parameter so flexibel wie die obrigen Methoden reagieren würde?
An sich will ich einfach nur einen möglichst allgemeinen Ansatz für eine Klasse(nhierachie) haben, die mir das Speichern verschiedenster Datentypen auf verschiedenste Weise ermöglicht.

Weißt du, was ich meine?
 

nrg

Top Contributor
kleines beispiel:
Java:
import java.io.*;
import java.util.*;
import java.util.Map.Entry;


public class FileManager {
	
	private BufferedWriter writer;
	
	public FileManager( String file ) throws IOException {
		writer = new BufferedWriter( new FileWriter( file ) );
	}
	public FileManager( String file, boolean append ) throws IOException {
		writer = new BufferedWriter( new FileWriter( file, append ) );
	}
	public void mapToFile( Map<?, ?> input, String delimiter ) throws IOException {
		for ( Entry<?, ?> e : input.entrySet() ) {
			writer.write( e.getKey().toString() + ", " + e.getValue().toString() + delimiter );
		}	
	}
	public void listToFile( List<?> input, String delimiter ) throws IOException {
		for ( Object o : input ) {
			writer.write( o.toString() + delimiter );
		}	
	}
	public void close() throws IOException {
		writer.close();
	}
}
Java:
import java.io.IOException;
import java.util.*;

public class TestFileManager {
	public static void main( String[] args ) throws IOException {
		FileManager fm = new FileManager( "C:/test.txt", true );
		List<String> list = new ArrayList<String>();
		list.add( "Das" );
		list.add( "ist" );
		list.add( "eine" );
		list.add( "Liste" );
		fm.listToFile( list, "\r\n" );
		
		Map<Integer, String> map = new HashMap<Integer, String>();
		map.put( 1, "Das" );
		map.put( 2, "ist" );
		map.put( 3, "eine" );
		map.put( 4, "Map" );
		fm.mapToFile( map, "\r\n" );
		fm.close();
	}
}

edit: set kannste ja anhand des beispiels selber machen
 

faetzminator

Gesperrter Benutzer
Oder...
Java:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Arrays;
import java.util.List;

public class Test {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        
        List<String> list = read(write(Arrays.asList("foo", "bar", "baz")));
        
        for (String s : list) {
            System.out.println(s);
        }
    }
    
    static File write(Object obj) throws IOException {
        File file = File.createTempFile("foo", ".tmp");
        file.deleteOnExit();
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(file));
        os.writeObject(obj);
        return file;
    }
    
    @SuppressWarnings("unchecked")
    static List<String> read(File file) throws IOException, ClassNotFoundException {
        ObjectInputStream is = new ObjectInputStream(new FileInputStream(file));
        return (List<String>) is.readObject();
    }
}
 

nrg

Top Contributor
zur datenerhaltung bzw. wenn du die liste zu einem späteren zeitpunkt wieder auslesen willst eignet sich serialisierung natürlich deutlich besser
 

Degget

Mitglied
Danke. Sind schon mal 2 gute Ideen :)

Warum hast du, nrg, die close()-Methode eigtl nicht direkt in die ...toFile()-Methode integriert? Ich dachte, dass man sowieso jeden writer wieder closen sollte?

zur datenerhaltung bzw. wenn du die liste zu einem späteren zeitpunkt wieder auslesen willst eignet sich serialisierung natürlich deutlich besser

Von Serialisierung weiß ich noch gar nichts. Werde mich da mal reinlesen. Kurze Frage schon vorher: warum ist es besser? Perfomance oder Einfachheit der Anwendung?

edit:
Moment. Das was faetzminator macht ist im Prinzip schon Serialisierung, oder?
 
Zuletzt bearbeitet:

nrg

Top Contributor
Warum hast du, nrg, die close()-Methode eigtl nicht direkt in die ...toFile()-Methode integriert? Ich dachte, dass man sowieso jeden writer wieder closen sollte?

wenn du die klasse von aussen verwendest, wäre es sinnvoll auch selbst entscheiden zu können, wann der stream geöffnet bzw geschlossen wird. ein bufferedreader wird doch auch nicht mit new BufferedReader() instanziiert und dann in der write(String filename, String input) geöffnet und direkt wieder geschlossen. das wäre zudem absolut unperformant.

Von Serialisierung weiß ich noch gar nichts. Werde mich da mal reinlesen. Kurze Frage schon vorher: warum ist es besser? Perfomance oder Einfachheit der Anwendung?

du packst halt dein komplettes object in einen stream und schreibst es in eine datei. dann brauchst du dir überhaupt keine gedanken darüber zu machen, wie du das speicherst bzw wie du es passend wieder ausliest. das macht alles die api für dich. würde dir hier aber xml empfehlen. voraussetzung dafür ist aber eine bean konforme klasse

edit:
Moment. Das was faetzminator macht ist im Prinzip schon Serialisierung, oder?
ja
 

Atze

Top Contributor
ja, ne kombination aus generics und serialisierung sollte der beste mittelweg sein. ich denke aus den codes von faetzminator und nrg wirst du dir was zusammen bauen können :)
 

faetzminator

Gesperrter Benutzer
Also, ich seh da in nrg's Code nicht viel an Generics :D Ich würde höchstens diese zwei Methoden in eine Klasse Auslagern, dort ggf. [c]file[/c] intern verwalten und den Typen von [c]read()[/c] per Generics festlegen.
 

Degget

Mitglied
kleines beispiel:
Java:
	public void mapToFile( Map<?, ?> input, String delimiter ) throws IOException {

Ich habe es bisher einfach hingenommen, weil es so toll funktionierte, aber was genau macht das Fragezeichen als Datentyp eigentlich? Wäre es dasselbe, als wenn ich Object schreiben würde? Sah es jetzt das reste mal in der Anwendung...
 

faetzminator

Gesperrter Benutzer
Wie wärs so?
Java:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Arrays;
import java.util.List;

public class Test<T> {

    public static void main(String[] args) throws IOException, ClassNotFoundException {

        Test<List<String>> test = new Test<List<String>>("test");
        test.write(Arrays.asList("foo", "bar", "baz"));

        List<String> list = test.read();

        for (String s : list) {
            System.out.println(s);
        }
    }

    private File file;

    public Test(String name) throws IOException {
        file = File.createTempFile(name, null);
        file.deleteOnExit();
    }

    public void write(T obj) throws IOException {
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(file));
        os.writeObject(obj);
        os.close();
    }

    @SuppressWarnings("unchecked")
    public T read() throws IOException, ClassNotFoundException {
        ObjectInputStream is = new ObjectInputStream(new FileInputStream(file));
        T t = (T) is.readObject();
        is.close();
        return t;
    }
}
[c]Test[/c] kann man allenfalls noch umbenennen :)
 

Degget

Mitglied
Danke für eine weitere Lösung. Das Serialisieren gefällt mir an sich sehr.
Ich wäre trotzdem noch an einer Antwort auf die Frage, was genau das "?" in zum Beispiel Map<?, ?> bewirkt. Ist es wie Map<Object, Object> oder noch was anderes?
 

faetzminator

Gesperrter Benutzer
Danke für eine weitere Lösung. Das Serialisieren gefällt mir an sich sehr.
Ich wäre trotzdem noch an einer Antwort auf die Frage, was genau das "?" in zum Beispiel Map<?, ?> bewirkt. Ist es wie Map<Object, Object> oder noch was anderes?

Ja, das heisst, es ist unklar, von welchem Typ die Daten sind. Problem ist dabei, dass dann die Map gecastet werden muss. Bei meinem Code schert sich der Programmierer nicht mehr drum, einfach ein Mal eine Instanz mit Generics anlegen, danach schreiben und lesen wie man will.
 

nrg

Top Contributor
Ja, das heisst, es ist unklar, von welchem Typ die Daten sind. Problem ist dabei, dass dann die Map gecastet werden muss. Bei meinem Code schert sich der Programmierer nicht mehr drum, einfach ein Mal eine Instanz mit Generics anlegen, danach schreiben und lesen wie man will.

und wo muss man bei meinem explizit casten? dadurch, dass jede klasse eine toString() (im zweifelsfall von object geerbt) hat ist mir das doch grad egal, von welchem typ das ist. @to: falls es dir noch unklar ist, google mal wildcards java

edit: aber gut hast schon recht. die klasse gleich generisch zu instanziieren, ist schon ein stück eleganter.. war ja nur ein vorschlag :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Edin Sinnvolle Projekt-/Codepräsentation Java Basics - Anfänger-Themen 2
J eine sinnvolle Route aus ausgewählten GPX- Tracks Java Basics - Anfänger-Themen 0
D frage zur meinem objekt. sinnvolle objektmethode Java Basics - Anfänger-Themen 3
D Projekt strukturieren. sinnvolle klassen erstellen Java Basics - Anfänger-Themen 6
8 Was sind Sinnvolle PlugIns für Eclipse? Java Basics - Anfänger-Themen 2
H Fehlerbehandung über tiefer Klassenhierachie Java Basics - Anfänger-Themen 6
M Länge eines Arrays als Variable speichern möglich? Java Basics - Anfänger-Themen 14
R Liste in Variable speichern Java Basics - Anfänger-Themen 6
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
G JTree speichern und wieder einlesen Java Basics - Anfänger-Themen 5
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
P Wie kann ich beispielsweise Speicherstände eines Spiels DAUERHAFT in meinem Programm speichern? Java Basics - Anfänger-Themen 3
J Objekte in JSON speichern?? Java Basics - Anfänger-Themen 1
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
I Objekte in ShareProject speichern um später zu nutzen Java Basics - Anfänger-Themen 4
I Passwort in Datenbank speichern um später wieder auszulesen Java Basics - Anfänger-Themen 5
S mehrere TreeSets so speichern, dass man sie miteinander vergleichen kann Java Basics - Anfänger-Themen 1
I Datei (Bild) Drucken und wie Druckeinstellung speichern? Java Basics - Anfänger-Themen 3
I H2 Datenbank starten / Daten in File speichern Java Basics - Anfänger-Themen 25
M Werte in Felder speichern und geordnet ausgeben Java Basics - Anfänger-Themen 8
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
L Dauerhaftes Speichern einer Eingabe bei einer ArrayList Java Basics - Anfänger-Themen 26
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
T Permanentes speichern von Objekten in einer ArrayList Java Basics - Anfänger-Themen 6
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
berserkerdq2 Ich gebe eine ArrayList als List zurück per MEthode, wie kann ich nun aber die ArrayList speichern? Java Basics - Anfänger-Themen 46
I Historisierung - Alter Wert, Neuer Wert... wie speichern? Java Basics - Anfänger-Themen 44
berserkerdq2 Wie datum im default format speichern? Java Basics - Anfänger-Themen 5
M Objekt in einem Objekt speichern Java Basics - Anfänger-Themen 9
J Speichern von zwei Variablen durch Auslesen aus einem Numberfield Java Basics - Anfänger-Themen 2
f3mys Objektwerte in Liste speichern und wieder abrufen Java Basics - Anfänger-Themen 23
I Liste von Infos von einer eigenen Annotation in Liste speichern Java Basics - Anfänger-Themen 0
U Wie ein Attribut von einer Klassenmethode in der Klasse speichern= Java Basics - Anfänger-Themen 2
B Screenshots machen und zwar viele und speichern Java Basics - Anfänger-Themen 12
C XML Datei speichern und laden Java Basics - Anfänger-Themen 18
Marlena Bauer Konsolenausgabe in .txt speichern Java Basics - Anfänger-Themen 6
B JaxB - Property vom Typ Object und LocalDateTime speichern? Java Basics - Anfänger-Themen 0
ansystin Teilerfremde Zahlen ausgeben + Zahlenausgabe speichern Java Basics - Anfänger-Themen 3
J Wert in einer json Datei ändern und speichern Java Basics - Anfänger-Themen 3
C File speichern Java Basics - Anfänger-Themen 5
D String und char in String speichern Java Basics - Anfänger-Themen 5
J Alle .java Dateien von einem Verzeichnis in eine Zip speichern Java Basics - Anfänger-Themen 2
I Werte (u.a. Geldbeträge) in Datenbank speichern und Rundungen? Java Basics - Anfänger-Themen 8
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
H Daten aus einer Datei in eine Liste speichern Java Basics - Anfänger-Themen 23
B JaxB - speichern vom Typ "Object" Java Basics - Anfänger-Themen 8
GermanPie Nachrichten Speichern Java Basics - Anfänger-Themen 2
M Objekte in Array speichern und ausgeben Java Basics - Anfänger-Themen 17
C Wo Defaultpfad speichern? Java Basics - Anfänger-Themen 2
M Integer aus aus einer Klasse in andere speichern Java Basics - Anfänger-Themen 12
Dimax stream in string[] speichern Java Basics - Anfänger-Themen 6
H Liste speichern. Was lässt sich verbessern? Java Basics - Anfänger-Themen 7
C Fehler beim Speichern (Build projekt) Java Basics - Anfänger-Themen 42
J Ich brauche Hilfe bei einem Code (Variablen speichern) Java Basics - Anfänger-Themen 29
C Verschiedene Objekte in einer Liste speichern Java Basics - Anfänger-Themen 6
D Input/Output Input von zwei Koordinaten validieren und anschließend Werte speichern Java Basics - Anfänger-Themen 7
N Speichern von Werten in Variablen nach Schließen des Programms Java Basics - Anfänger-Themen 3
G Problem beim Speichern von Objekten in einer Datei Java Basics - Anfänger-Themen 7
I ArrayList - Methode zum Speichern eines Eintrags in einer Datei Java Basics - Anfänger-Themen 17
H Objekt im Array speichern Java Basics - Anfänger-Themen 2
H Objekt als Attribut speichern Java Basics - Anfänger-Themen 11
B Text-Datei nur in Stream speichern und dann ausgeben Java Basics - Anfänger-Themen 3
M JTextField in ArrayList speichern Java Basics - Anfänger-Themen 4
L Nur Bestimmte Werte aus einem Array in ein anderes Speichern Java Basics - Anfänger-Themen 11
S Zweidimensionales Array in ein eindimensionales Array speichern Java Basics - Anfänger-Themen 6
A Wie zwei zahlen in einer Variable speichern? Java Basics - Anfänger-Themen 7
C ResultSet in Array speichern Java Basics - Anfänger-Themen 5
S Byte-Array kann chars speichern? Java Basics - Anfänger-Themen 3
J Kann man files in einer Klasse speichern. Java Basics - Anfänger-Themen 2
B Infos zu Attribute in einer Klasse speichern Java Basics - Anfänger-Themen 3
M Input/Output JTextField Eingabe in String Variable speichern Java Basics - Anfänger-Themen 15
A Kann man eine Methode als Variable speichern und danach noch verändern? Java Basics - Anfänger-Themen 6
D Werte aus einem BinärBaum in einem Array speichern Java Basics - Anfänger-Themen 1
I Datei in Programm speichern Java Basics - Anfänger-Themen 3
A .txt-Datei mit Java speichern Java Basics - Anfänger-Themen 2
M Speichern unter. Java Basics - Anfänger-Themen 11
S Java Daten in Excel speichern Java Basics - Anfänger-Themen 1
S Daten speichern, ohne Datenbank Java Basics - Anfänger-Themen 8
L Objekt aus Textdatei in ArrayList speichern Java Basics - Anfänger-Themen 4
L Kommandozeileneinträge in Array speichern Java Basics - Anfänger-Themen 4
B HTML Code in XML speichern Java Basics - Anfänger-Themen 3
G Benutzereingaben durch Zeilenumbruch trennen und in Array individueller Größe speichern Java Basics - Anfänger-Themen 20
G JTextField per Button speichern und an andere Klasse übergeben Java Basics - Anfänger-Themen 2
Shallty Daten speichern und ändern? Java Basics - Anfänger-Themen 32
R Objekte aus Array als String + kommasepariert speichern Java Basics - Anfänger-Themen 12
N Best Practice Rückgabe eines Terminal Befehls in eine Variable speichern Java Basics - Anfänger-Themen 27
B XML in DB speichern -> Regelkonzept Java Basics - Anfänger-Themen 2
T Daten von Objekten speichern Java Basics - Anfänger-Themen 7
A Einträge aus Tupeln nach Regeln in Liste speichern Java Basics - Anfänger-Themen 8
void19 Methoden Binärbaum Inorder Traversierung in Array speichern Java Basics - Anfänger-Themen 1
X TextField-Inhalt mit Button in .txt-Datei speichern Java Basics - Anfänger-Themen 16
C Methoden Problem beim Speichern von Variablen Java Basics - Anfänger-Themen 1
J Geld speichern und wieder auslesen Java Basics - Anfänger-Themen 10
K Geburtsdaten von Mehreren Personen speichern und Alter ausgeben Java Basics - Anfänger-Themen 11
F Beste Datenstruktur zum Speichern? Java Basics - Anfänger-Themen 1
Dimax Programme ,als Text in MySql speichern Java Basics - Anfänger-Themen 7
C Erste Schritte ArrayIndexOutOfBoundsException beim Speichern im Array Java Basics - Anfänger-Themen 2
D Datei auslesen & Werte in Variable speichern Java Basics - Anfänger-Themen 12
D Erste Schritte Projekt in Ecplise in einer .zip Datei speichern Java Basics - Anfänger-Themen 8

Ähnliche Java Themen


Oben