[Java] Daten in der Programmdatei speichern

Roin

Freier Denker
Registriert
22 Juli 2013
Beiträge
581
Hi Leute,

ich schreibe gerade in Java an einem kleinen Programm, welches ich immer mal zwischendurch ausführen möchte.
Ich möchte idealerweise eine Datei haben (die auszuführende .jar) und keine weiteren Ordner oder so. Ich starte das Programm, gebe irgendetwas ein, das in einer (meistens neuen) Datei gespeichert wird und dann schließe ich das Programm wieder. Die gespeicherten Daten, werde ich in einem Ordner verschlüsselt und komprimiert speichern.

Nun ist mein Wunsch, dass ich am Ende ein einzelnes Icon habe, welches ich anklicke, durch welches das Programm startet. Die Dateien sollen in dieser Datei gespeichert werden. So dass ich nur eine "wachsende" Datei habe ohne Ordner und so weiter.
Ich möchte das Programm ungern "installieren" müssen oder halt die Dateien extern speichern.
Allerdings habe ich etwas davon gelesen, dass die .jar Datei beim Ausführen gesperrt ist.

Gibt es da eine Möglichkeit das zu machen, oder muss ich damit leben, dass ich den Ordner und meine ausführbare Datei habe?
 
Hallo,
was genau spricht eigentlich gegen eine Daten-Datei (die auch gerne im gleichen Ordner liegen darf)? Damit musst du das Programm noch lange nicht installieren, und kannst das auch bspw. von einem USB-Stick aus starten. Das wäre zumindest der übliche Weg.

Google (bzw. StackOverflow) waren sich nicht ganz einig, ob die Jar-Datei während der Ausführung gesperrt ist oder nicht, das könnte evtl. auch vom Betriebssystem (und der JRE) abhängen. Im Zweifelsfall einfach mal ausprobieren. Evtl. könnte man da aber was tricksen, indem man die Daten in eine neue Jar-Datei schreibt, und die Alte nach Programmende gegen die neue Jar austauscht.

Daten in die Jar zu bekommen ist nicht weiter schwer. Eine Jar ist auch nur ein Zip-Archiv mit ein paar speziellen Dateien drin, Packages werden dabei durch Ordner repräsentiert. Auf die Daten kannst du mit der Methode "getResourceAsStream()" oder ähnlichen zugreifen:
[src=java]public class ResourceManager {
public static InputStream getResource(String name){
return ResourceManager.class.getResourceAsStream(name);
}
}[/src]Die Klasse einfach in den gleichen Ordner wie die Daten werfen.
 
Evtl. könnte man da aber was tricksen, indem man die Daten in eine neue Jar-Datei schreibt, und die Alte nach Programmende gegen die neue Jar austauscht.
Das klingt aber ganz schmutzig, ich denke man kann sich nicht dagegen absichern im Fehlerfall dann zwei Jar-Dateien zu haben.
 
  • Thread Starter Thread Starter
  • #4
was genau spricht eigentlich gegen eine Daten-Datei (die auch gerne im gleichen Ordner liegen darf)?
An sich spricht nichts dagegen, doch ich würde gerne halt ein "Icon" haben, welches auch alle Daten enthält. Eine einzige Datei (also eine Datendatei) zu haben wäre etwas... schwierig. Ich speichere nämlich relativ viele Daten pro Datensatz mit auch teilweise sehr langen Texten usw. Ich versuche mir gleichzeitig die Möglichkeit zu bewahren die Datensätze nach "Dateinamen" anzusprechen, ohne die Dateinamen (bzw. dann die entsprechenden Datensatz-IDs) vollständig in ein Array zu speichern. Die Datendatei könnte man zwar auch als Archiv zusammenfassen, doch dann dachte ich mir halt, dass wenn ich doch eh schon ein Archiv habe, dieses mit dem Programmarchiv zusammenfassen kann.

Nach weiterer Google-Recherche scheint das allerdings relativ unwahrscheinlich zu sein, dass ein derartiges Vorgehen klappt. Ich schreibe daher erstmal das Programm mit einigen Ordnern zum Speichern der Daten und werde mich dann später darum kümmern, diese Speicherplatz-Effizient und perfomant zu speichern.
 
Selbstmodifizierende Programme sind möglich, allerdings vor allem von Antiviren-Programmen (verständlicherweise) nicht gerne gesehen. In deinem Fall klingt es am sinnvollsten, anstatt das Dateisystem als Datenbank zu nutzen einfach direkt eine Datenbank zu nutzen. Es gibt nach einer kurzen Recherche verschiedene Datenbank-Bibliotheken, die ihre Datenbank in eine einzelne Datei schreiben können - du liest sie also während dem Starten ein, machst deine Änderungen und schreibst sie beim Beenden wieder auf die Platte.
 
  • Thread Starter Thread Starter
  • #6
Selbstmodifizierende Programme sind möglich, allerdings vor allem von Antiviren-Programmen (verständlicherweise) nicht gerne gesehen.
Daran habe ich noch gar nicht gedacht - Das wird dann vermutlich auch schwierig zu umgehen sein, dass das Programm dann als "sicher" durchgeht.

Einfach direkt eine Datenbank zu nutzen. Es gibt nach einer kurzen Recherche verschiedene Datenbank-Bibliotheken, die ihre Datenbank in eine einzelne Datei schreiben können
Die Möglichkeit habe ich total übersehen. Klar gibt es Bibliotheken, die Datenbanken implementieren.

du liest sie also während dem Starten ein, machst deine Änderungen und schreibst sie beim Beenden wieder auf die Platte.
Da muss ich mir etwas "besseres" einfallen lassen. Die Daten sollen nach Möglichkeit sofort gespeichert werden, teilweise noch während der Eingabe (also alle paar Sekunden). Das ist mit einem Dateisystem etwas einfacher zu handhaben, da nicht gleich alles neu geschrieben werden muss.
Zudem werden die Daten alle verschlüsselt - entweder verschlüssele ich die Daten in der Datenbank oder die Datenbank an sich. Wobei mir letzteres sicherer und performanter erscheint, da auch die Felder usw. unbekannt bleiben. Das ist aber ein anderes Thema.
 
Du könntest ja auch mal das Ganze Programm erklären - evtl. gibts auch allgemeine Designfehler? ;D
Wo kommt die Anwendung denn zum Einsatz? Wenn nur unter windows + ntfs wären evtl. Alternative Datenströme noch eine Möglichkeit
 


Daran hatte ich auch gedacht, aber da ist
1)die Frage, ob das zur Laufzeit geht.
2) könnten die Daten flüchtig sein. Ich meine vor Jahren nur mal das Kommentarfeld von NTFS verwendet haben zu wollen, und die Daten gingen, glaube ich, z.B. beim Zippen verloren.
 
  • Thread Starter Thread Starter
  • #9
Du könntest ja auch mal das Ganze Programm erklären - evtl. gibts auch allgemeine Designfehler?
Das Programm ist immer für einen einzigen Anwender gedacht - eventuell gibt es dieses "Programm" mit den Daten allerdings mehrfach auf einem Computer.
Da die Daten, die jeweils gespeichert sind, sehr sensibel (sein können/) sind, möchte ich diese verschlüsseln (anderer Thread) und in einer Datei speichern, damit die Daten nicht verloren gehen, sollte man das Programm beispielsweise auf einen USB-Stick ziehen oder ähnliches. Gibt es mehrere Dateien für das Programm, habe ich die Erfahrung gemacht, dass es viele User schaffen, Daten nicht mitzukopieren und somit nichts mehr geht.
 


Ich habe mich heute morgen an "safey" erinnert, welches ich noch irgend wo gespeichert haben muß. Ein Programm, welche genau das geforderte macht, die Daten in der exe speichern.

Man sollte sich das mit den Datenströmen mal ansehen. ":" im Pfad ? :unknown:

EDIT:

"safey" war kein gutes Beispiel. Das ist nur für Passwörter, sprich kurze texte. Des weiteren springt jetzt mein Virenscanner nach Eingabe von Daten darauf an. Vielleicht Zufall, vielleicht aber auch eine nicht ganz einwandfreie Methode zur exe-Manipulation.

Alternate Data Streams:
1) Das funktioniert aus dem laufenden Betrieb heraus.
2)Aber meine Vermutung war richtig: Da das NTFS ist, gehen die Informationen beim Zippen verloren. Kopieren mit Infos auf einen FAT-Stick geht natürlich erst recht nicht.
 
Zuletzt bearbeitet:
Zurück
Oben