Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
1.Frage:
kann man Objekte in eine TXT-Datei speichern oder was für eine Datei sollte man nutzen?
2.Frage
Wie kann ich eine Datei, in der meine Objekte sind durchlaufen?
Ich will diese Objekte nicht einlesen, sondern ich möchte nur überprüfen, ob mir ein übergebener Parameter, mit irgendeinem Attribut eines Objekts, welches sich in der Datei befindet, übereinstimmt.
Du kannst Objekte, welche das Interface [c]Serializable[/c] implementieren, einfach serialisiert irgendwohin speichern - natürlich auch in Dateien. Die Endung der Datei interessiert dein Programm natürlich nicht...
2.Frage
Wie kann ich eine Datei, in der meine Objekte sind durchlaufen?
Ich will diese Objekte nicht einlesen, sondern ich möchte nur überprüfen, ob mir ein übergebener Parameter, mit irgendeinem Attribut eines Objekts, welches sich in der Datei befindet, übereinstimmt.
Die serialisierten Daten musst du natürlich einlesen, danach kannst du alles abfragen. Würdest du das nicht wollen, müsstest du die Daten sonst irgendwie (aufwändiger) speichern.
FileInputStream fileIn = new FileInputStream("file.txt");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (ObjektBezeichnung) in.readObject();
in.close();
fileIn.close();
Damit wird aber nur das erste Objekt in der Datei eingelesen(Oder irre ich mich da?)
Ich will aber alle Objekte in der Datei durchlaufen und denke dass man das mit ner Schleife machen müsste.
Kann da einer helfen?
von einer for-Schleife hast du doch sicher schon gehört oder?
es bietet sich aber dennoch an, nur ein Objekt zu speichern, und zwar eine Liste, in der alle anderen Objekte drin sind,
nur Liste laden/ speichern,
dann mit for-Schleife die Liste durchlaufen, ganz normal in Java
Nun verwirrt den armen doch nicht so! Offenbar herrscht hier Unklarheit über die Funktion des Suffixes. Der Suffix ist für das Betriebssystem interessant, damit es weiß, wie es den Inhalt einer Datei (Bits auf einem Datenträger) zu interpretieren hat und für den User ebenso. Wenn Objekte nur innerhalb eines Programms verwendet werden, also die Klasse zum erstellen verfügbar ist, spricht denke ich generell nichts dagegen, die Attribute der zu speichernden Objekte als Text zu speichern und sie mit diesen dann ausgelesenen Werten wieder zu initialiesieren, weil so Speicherplatz gespart wird.
Der Suffix für diese Speicherdatei ist dabei irrelevant, kann nach belieben gewählt werden oder nicht.
... das Betriebssystem interessant, damit es weiß, wie es den Inhalt einer Datei (Bits auf einem Datenträger) zu interpretieren hat und für den User ebenso.
Wenn du mit "interpretieren" meinst: welches Programm bevorzugt wird, zum öffnen der Datei & welches Icon angezeigt werden soll, dann hast du recht. Eine Liste der registrierten Dateiendungen findest du in (Windows in) der Registry unter: [c]HKEY_CLASSES_ROOT[/c]. Dort sind z.B. das StandartProgramm zum Öffnen und das Icon hinterlegt.
Ums nochmal kurz zu fassen: Du kannst dein Objekt auch in einer *.haumichtod Datei speichern oder komplett ohne Endung. Der Dateinname ist fast komplett unwichtig. Das einzige wofür du ihn benötigst ist, dass du die Datei zum öffnen findest ;-). Generell würde ich aber von .txt abraten, da Benutzer die Eigenschaft haben, in Dateien reinzuschauen, die Sie nichts angehen (und Anfangen "rechtschreibfehler" zu korrigieren). Ich würde .dll o.ä. verwenden.
Ich würde noch das hier in den Ring werfen: XMLEncoder (Java 2 Platform SE v1.4.2).
Da könnte man sogar das XML parsen ohne die Objekte einlesen zu müssen.
... dennoch hört sich dieser Thread schon wieder so an, als hätte der TS ein Problem, denkt sich dafür eine Lösung aus, kann die Lösung nicht realisieren und fragt, wie er seine Lösung wohl am besten hinbekommt, anstatt zu fragen, wie er sein Problem am besten lösen könnte...
Ich könnte mir vorstellen, dass für das eigentliche Problem eine kleine DB (in Memory, z.B. HSQLDB) eine Lösung sein könnte... könnte halt... ich kenne ja das Problem nicht....
Na ja, dem widerspricht aber folgende Anforderung:
Wie kann ich eine Datei, in der meine Objekte sind durchlaufen?
Ich will diese Objekte nicht einlesen, sondern ich möchte nur überprüfen, ob mir ein übergebener Parameter, mit irgendeinem Attribut eines Objekts, welches sich in der Datei befindet, übereinstimmt.
Aber naja. Die Datei muss iwie gelesen werden und ob man die Jetzt als String einließt und dann die Zeichenkette untersucht oder ob man eine Liste hat, in der man einfach prüfen kann:
[c]list.contains("wert");[/c]
macht sich zeitlich für den Enbenutzer nicht bemerkbar. Wer weis, vllt täte es ja schon eine einfache Property-file
also ich erkläre das nochmal.
Ich schreibe einen Vokabeltrainer wo jede Vokabel ein Objekt ist.
Wenn ich jetzt eine neue Vokabel in meinen Vokabeltrainer eingebe, soll das Vokabelobjekt in einer externen Datei gespeichert werden.
Wenn ich jetzt eine bestimmte Vokabel suche, muss ich das eingegebene Wort mit all meinen Vokabeln in der Datei vergleichen.
Dabei lese ich die Vokabeln ein und wie mache ich das genau?
Java:
FileInputStream fis = new FileInputStream(vokabeln);
ObjectInputStream ois = new ObjectInputStream(fis);
Vokabel vokabel = (Vokabel)ois.readObject();
Hiermit bekomme ich nur die erste Vokabel aus der Datei raus.
Ich will aber alle, um alle mit meinem Wort vergleichen zu können.
Wenn ich das richtig verstehe: du willst zum Prüfen der Vokabel (oder zum anzeigen in der Frage) jedes mal die "vokabel"-Datei laden?!
Also prinzpiell: für soetwas ein komplettes Objekt zu serialsieren halte ich für unnötig. Da reicht es ja [c]Hello=Hallo[/c] und iwie vermerken, das links Englisch und rechts Deutsch steht (oder eben eine Datenbank, H2 würde ich da empfehlen )
Dann liest du nicht permanent die Vokabeln ein. Die lädst du einmal beim Programmstart und behälst diese zur Laufzeit. Wenn neue angelegt werden, bleiben die natürlich auch zur Laufzeit vorhanden und Speicherst die Vokabeln einfach beim erstellen ab.
Nenn die Datei zum speichern wie die Vokabel, z.B. "Haus - house.ser" wobei .ser ein von mir vorgeschlagener Suffix für serialisierte Objekte ist. Du erhälst dann mit File.listFiles() alle Dateien des Verzeichnisses in einem Array, über das du Iterieren kannst. Solltest du vieleviele Vokabeln haben, könntest du Verzeichnisse A-Z anlegen auf die du dann bei der Suche gezielt zugreifen könntest um die Suchzeit zu reduzieren.
Aus eigener Erfahrung (Tribuit - vocabulary trainer | Download Tribuit - vocabulary trainer software for free at SourceForge.net) halte ich Serialisierung für eine schlechte Idee, weil du die Klasse "Vokabel" evtl noch verändern wirst und sobald du das machst, sind die gespeicherten Objekte nicht mehr zu gebrauchen, darum würde ich dir das Speichern in eine Textdatei empfehlen. Die Vokabeln kannst du dann mit einem Separator trennen und beim Einlesen mittels String.split(String arg) wieder trennen.
Gruß n.
edit: Müsstest dann freilich drauf achten, dass die Zeichen, die du als Separator benutzt, nicht eingegeben werden können!
Properties (Java direkt), XML (Jaxb/EMF und Co)... es gibt viele einfache Möglichkeiten in Java, bei denen man nicht mit dem Splitten von String herumärgern muß. Wenn das Projekt zur Übung dienen soll, nimm doch HSQL, dann kannst Du SQL Erfahrung sammeln und HSQL speichert die Skripte in eine Datei ab.
Hi,
ja das ist nur zur Übung.
Ich wollte mich eigentlich für fastjacks Variante entscheiden, kann aber kein HSQL auf mein Eclipse installieren.
Irgendwas stimmt da nicht.
Werde jetzt die Variante von Noobadix übernehmen.
Wäre aber trotzdem cool wenn trotzdem jemand nen kleinen Code zu meinem Problem posten könnte, nur damit ich bescheid weis.
Würde mich echt gerne interessieren.
Gruss!
Es würde dich gern interessieren? Hm, das Motto hier ist doch: "Java programmieren aus Leidenschaft" --> Leidenschaft, ist, was Leiden schafft --> google ^^
Du brauchst drei Komponenten:
1 Eine Methode, die die Vokabel-Informationen zu einem String bastelt und die Separatoren einfügt und diesen in eine Datei schreibt
2. Eine Methode, die die Datei wieder ausliest und die Vokabeln initiiert.
3. Eine Klasse, die die Daten zur Laufzeit hält.
Fang bei Punkt 3 an:
Du brauchst also eine Art Vokabular. Dies kannst du als HashMap realisieren und diese einfach serialisieren. Weil dein Vokabular jedoch wahrscheinlich mehr Funktionen bereit stellen soll als eine stinknormale HashMap, solltest du eine eigene Klasse Vokabular implementieren, die Funktionen wie löschen, bearbeiten usw. bereitstellen und auch einen eigenen, editierbaren Namen als Attribut führen kann. Diese Klasse könnte dann ein Array von Vokabel-Objekten beinhalten und die Methode, die den "Datenstring" zum Speichern erzeugt makeDataString(): Diese könnte so aussehen (wobei vokabular das Vokabel-Array ist und "$" als separator zwischen den Vokabeln und ":" der zwischen den zwei Bedeutungen der einzelnen Vokabeln ist und ich voraussetze, dass die Klasse Vokabular die Methoden getName1() und ~2() hat):
Java:
public String makeDataString(){
if(vokabular!=null && vokabular.length>0){ // bei && wird zweite Bedingung nur durchgeführt, wenn erste true -->vermeidung von NullPointerException, wenn vokabular==null
StringBuffer sb = new StringBuffer();
for(int i=0;i<vokabular.length;i++){
sb.append(vokabular[i].getName1() + ":" + vokabular[i].getName2() );
if(i<vokabular.length-1)sb.append("$"); //würde $ zuletzt stehen, würde split("$") ein Array mit null als letzten Wert liefern
}
return sb.toString();
}
else return null;
}
Sorry, dass ich so spät antworte.
Ich speichere die Vokabeln in ein Vokabel-Array und dieses Array wird dann in die externe Datei gespeichert.
Ich finde diese Lösung nicht gut, denn jedesmal wenn ich eine Vokabel speichern will, wird erstmal das ganze Array aus der Datei ausgelesen, die Vokabel wird in das Array gespeichert und anschliessend wird das Array wieder in die Datei gespeichert.
Also werden meine Vokabeln während der Laufzeit nirgends gehalten im Programm.
Hier meine Vokabelklasse:
Java:
public class Vokabel implements Serializable{
public Vokabel(String e, String g) {
this.german = g;
this.english = e;
tested = false;
}
}
Hier das Vokabel-Array
Java:
public class Vokabeldatenbank implements Serializable {
Vokabel [] vok;
int count;
Vokabeldatenbank(){
vok = new Vokabel[1999999999];
count = 0;
}
}
Hier wie ich eine neu eingegebene Vokabel abspeicher
Java:
File vokabeln = new File("Vokabeln.dll");
private void saveVokabelinFile(String english, String german) throws IOException, ClassNotFoundException{
if(vokabeln.exists()){
FileInputStream fis = new FileInputStream(vokabeln);
ObjectInputStream ois = new ObjectInputStream(fis);
vdb = (Vokabeldatenbank) ois.readObject();
vdb.addVokabel(new Vokabel(english, german));
FileOutputStream fos = new FileOutputStream(vokabeln,false);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(vdb);
oos.close();
}
else{
FileOutputStream fos = new FileOutputStream(vokabeln,false);
ObjectOutputStream oos = new ObjectOutputStream(fos);
Vokabel vokabel = new Vokabel(english, german);
vdb.addVokabel(vokabel);
oos.writeObject(vdb);
oos.close();
}
}
Hat da jemand vielleicht ne bessere Lösung, da meine Vokabeln während der Laufzeit nirgends gehalten werden.
Hab mir vielleicht gedacht dass das mit der Eingabe einer Vokabel in der main erfolgen sollte?
Und das meine Vokabeldatenbank eine feste Grösse hat, ist auch doof.
Gruss!