# Dateien verbergen



## JUserToto (4. Nov 2010)

Hallo zusammen,

nun programmiere ich schon seit ich zwölf bin und mich beschäftigt schon immer die Frage "Wie verberge ich meine Dateien?".
Im Moment programmiere ich eine kleine Adventure-Engine, um mich in Swing einzuarbeiten.

Die Engine benötigt natürlich diverse Dateien:

- eine Textdatei, in der der eigentliche Spielablauf gespeichert ist. Diese Textdatei wird von der Engine geparsed und damit wird das Adventure erstellt.
- Bilder. Hintergrundbilder, Objektbilder, Animationsgrafiken...
- Audiodateien für die Sprachausgabe.

Nun wäre es im Endeffekt ja nicht so toll, wenn andere Benutzer an der Textdatei herumschreiben könnten und damit das Spiel ändern könnten. Es wäre auch nicht toll, wenn man die Bilder ändern könnte und sie dann auch so im Spiel dargestellt werden.

Meine Frage also: Wie verberge ich diese Dateien?
Ich vermute, dass man dies mit einem Archiv macht, aber auch ein Archiv könnte ja jeder Benutzer öffnen...

Gibt es irgendeine einfache Lösung, die ich noch nicht bedacht habe, oder ein nettes Tutorial, wie man dieses Problem lösen kann?

liebe Grüße
Toto


----------



## Kaffeebohn (4. Nov 2010)

Hiho,

ich finde es grundsätzlich nicht schlimm, dass der Benutzer das Spiel "grundsätzlich" verändern kann. Ich denke da gerade an ReVolt wem das Spiel was sagt. Da kam der Spass erst richtig auf, wenn man selbstbemalte, getunte Autos gebastelt hat. Oder was wäre Age of Empires II ohne die eigenen Taunts!

Grundsätzlich kannst du deine Dateien ja verschlüsselt ablegen oder in einem eigenen Format. Dann wäre das Ändern schon um ein Vielfaches schwieriger.

Dein Spielverlauf wird ja in irgend einer Form von deinem Programm geparst. Du könntest auch das Ergebnis dieses Vorgangs serialisieren und in einer Datei abspeichern. Die wäre auch nicht so einfach zu verändern.


Aber überleg es dir noch mal ;-)

Liebe Grüße


----------



## JUserToto (4. Nov 2010)

Hey,
Danke.
natürlich bin ich grundsätzlich für solche Geschichten.
Ich hätte auch nichts dagegen, einen Editor zur Verfügung zu stellen etc.
Es geht mir eher darum, dass ein fertiges Spiel "abgeschlossen" sein sollte, sodass man durch falsche Grafiken oder Änderungen an der Textdatei nichts "kaputt machen" kann. Man kann das Spiel zwar auch kaputt machen, indem man eine Datei einfach löscht, aber ich finde eine unverschlüsselte Textdatei, in der das ganze Spiel niedergeschrieben ist (und damit auch alle Lösungen) REIZT nahezu dazu, daran rum zu schreiben.

An Verschlüsselung habe ich auch schon gedacht. Das wäre bei der Textdatei sicherlich eine Möglichkeit (Die könnte man theoretisch ja auch als String per StringReader übergeben, sodass man garkeine Textdatei braucht)... Bilder und Audiodateien zu verschlüsseln scheint mir da wesentlich komplizierter...
Wenn man das allerdings tatsächlich so macht, werde ich mich da wohl einlesen müssen.


----------



## Kaffeebohn (4. Nov 2010)

Ich hab hier grad in nem anderem Forum was gefunden was vlt. für dich passt

Signing and Verifying JAR Files (The Java™ Tutorials > Deployment > Packaging Programs in JAR Files)

Wenn du dem Englischen einigermaßen mächtig bist findest du da vielleicht Hinweise, wie du deine Jar schützen kannst.

Grüße


----------



## JUserToto (4. Nov 2010)

Hey,

da sagst du was...
Meine Bilder liegen zur Zeit im Arbeitsverzeichnis. Das Arbeitsverzeichnis ermittle ich vorher.
Besser wäre es natürlich schonmal, wenn sie im jar Verzeichnis wären.
Ich sitze nun seit du mir den Tipp gegeben hast hier und versuche das umzustellen.

Doch es klappt einfach nicht. Rufe ich die Datei einfach mit "file.txt" auf, funktioniert es überhaupt nicht.
Ich habe es also so probiert:

String scenes = "Images/Scenes/";
scenes = DirConstants.class.getResource(scenes).getPath();

DirConstants ist eine Klasse, die ich mal zum Verwalten der ganzen Pfade erstellt habe...

Damit bekommt er auch eigentlich das richtige Verzeichnis...
c:/users/bla/Desktop/Neuer%20Ordner/spiel.jar!/Images/Scenes/

wenn ich allerdings versuche damit etwas anzufangen krieg ich eine FilenotFound Exception. 

Warum macht einem Java nur manchmal das Leben so kompliziert? ???:L


----------



## babuschka (4. Nov 2010)

Recht einfach wäre es doch, für die Bild- und Tondateien eine Checksumme  (z.B. MD5) zu berechnen. Bei Programmstart berechnest Du von allen Dateien im Programmverzeichnis erneut die Checksumme und vergleichst sie mit dem Original. Stimmen sie nicht überein, so wurden die Dateien manipuliert und Du kannst entsprechend darauf reagieren.


----------



## JUserToto (4. Nov 2010)

Hallo,
danke für die Idee.
Ist sicherlich auch eine Überlegung wert.
Allerdings müsste ich die md5 hashes dann auch fest einprogrammieren.
Jetzt muss ich es erstmal schaffen, die Dateien direkt im Jar File anzusprechen...


----------



## Steev (4. Nov 2010)

Dateien werden direkt im JAR-File über die URL bzw. URI angesprochen. Und zwar relativ zur entsprechenden Klasse mithilfe von getClass().getResource(yourResource).

Gruß
Steevn


----------



## JUserToto (4. Nov 2010)

Hallo,

das habe ich probiert, kriege aber eine FileNotFound Exception  Sitze da nun seit Stunden dran und es kommt nichts gescheites bei rum.
Ich habe eine Klasse zum Starten des Spiels (StartGame). Da steht nun u.A. drin:

[Java]
        URL filepath = StartGame.class.getResource("/RUN/game.jefag");
        GUI.Game game = Parser.parse(filepath,
                darstellung);
[/Java]

Im Parser dann folgendes:

[Java]
BufferedReader reader = new BufferedReader(new InputStreamReader(filepath.openStream()));
        GUI.Game game = gameParser.parse(reader, [...]);
[/Java]

Was mache ich falsch? Geht es nicht statisch? ("StartGame.class.")


----------



## Steev (5. Nov 2010)

Die Datei muss relativ zu der angegebenen Klasse angegeben und abgvelegt werden. Das bedeutet, wenn die Klasse in dem Ordner / Package X liegt, dass dein Ordner Run ebenfalls dort abgelegt sein muss.


----------



## JUserToto (10. Nov 2010)

Mittlerweile funktioniert es. Warum... weiß ich nicht.

BufferedReader reader = new BufferedReader(new InputStreamReader(Parser.class.getResource("/RUN/game.jefag").getFile()));

So geht es. So wie es oben geschrieben ist nicht.

Danke jedenfalls!


----------

