Input/Output Beste Möglichkeit für user non-readable Datei

chaostheory

Bekanntes Mitglied
Hallo,
für ein Computer-Spiel möchte ich Punktestände (int) verbunden mit einem Zeitpunkt (long) und Namen (String) abspeichern. Bisher habe ich dafür eine .cfg-Datei verwendet.
Um Veränderungen/Manipulationen zu verhindern soll jetzt eine für Menschen nicht lesbare Datei genutzt werden. Ich dachte bisher an .dat, da es ein gängiges Format ist.
Ist dieses Format sinnvoll? Wie arbeite ich damit? Lese ich Zeilen wie in Textdateien oder schreibe ich einzelne Daten mit einem DataOutputStream wie bei Netzwerken?

Grüße und vielen Dank
 
Ob eine Datei vom Menschen (oder besser vom OS) nicht lesbar ist bestimmt nicht der Dateiname, sondern der Inhalt. Der Irrglaube, man könne eine Datei für das OS unlesbar machen, entstand erst bei der unkontrollierten Verbreitung des Microsoft-Viruses MS-Dos und seinen nachfolgenden Mutationen.
Das heisst, du musst den Dateiinhalt verschlüsseln oder zumindest signieren, z.B. mittels RSA.
 
So sicher muss es jetzt auch nicht sein. Ich will nur nicht, dass man die Datei mit dem Texteditor öffnen und direkt alles in Klartext ändern kann.
 
Öi... du hast nach der besten Möglichkeit gefragt. XD
Okay, dann sollte es wohl eine andere Dateiendung tun, die Daten kannst du in Klartext ablegen, solltest dann aber eine Prüfsumme an das Ende der Datei schreiben. Diese dann allerdings Binär, so dass sie halt nicht unbedingt als Text durchgeht. Die meisten Texteditoren steigen dann schon beim Lesen aus, bei Verwendung von Hexeditoren muss man halt nur noch drauf kommen, wie du die Prüfsumme erstellt hast.
Zum Schreiben der Datei empfiehlt sich, wie du schon sagst, ein DataOutputStream.
 
Wenn man mit einem DataOutputStream(FileOutputStream) primitive Datentypen in eine Datei schreibt (Hab's mit .txt und .dat getestet) kann der Editor nur char richtig anzeigen. Das reicht mir erst mal 🙂
 
Apropos Chaostheorie... Da fällt mir noch ein Ansatz ein:
Java:
import java.io.Serializable;
import java.util.TreeSet;


public final class Spielstaende
extends TreeSet<Spielstand>
{
	private static final long serialVersionUID = 214273152872591658L;

	public Spielstaende()
	{
		// nothing
	}

	public void addSpielstand(String name, int punkte, long zeit)
	{
		add(new Spielstand(name, punkte, zeit));
	}
}

class Spielstand
implements Serializable, Comparable<Spielstand>
{
	private static final long serialVersionUID = -8571213923450969724L;

	private final String name;
	private final int punkte;
	private final long zeit;

	Spielstand(String name, int punkte, long zeit)
	{
		this.name = name;
		this.punkte = punkte;
		this.zeit = zeit;
	}

	@Override
	public int compareTo(Spielstand o)
	{
		return (o.punkte > punkte)? -1 : (o.punkte < punkte)? 1 : 0;
	}

	@Override
	public String toString()
	{
		return name + " " + punkte + " " + zeit;
	}
}
Das sollte sich theoretisch mit 'nem ObjectOutputStream speichern lassen. Ob das dann noch jemand lesen kann? Einfaches Hinzufügen von Spielständen bereits integriert. Hat doch was. 😉
 
Sehr gute Idee! Habe schon einiges mit dem ObjectOutputStream geschrieben, deswegen sollte das kein Problem darstellen. Deine compare-Methode liefert 1 bei nem kleineren, 0 bei gleichem und -1 bei größerem Verlgeichspunktestand, oder?
 

Zurück
Oben