Problem mit DataOutputStream

Status
Nicht offen für weitere Antworten.

Ishildur

Bekanntes Mitglied
Hallo zusammen
Ich habe folgendes Problem mit dem DataOutputStream:

Während die DataInputStream Klasse über Methoden wie skip, mark und reset verfügt, habe ich keinerlei Äquivalente in der DataOutputStream Klasse gefunden! :(

Ich muss eine Datei speichern und muss hierfür in der Datei herumspringen können, weil sich viele der Headerinformationen erst mit der Zeit eruieren lassen!

Was kann man da machen?

Lg Ishildur
 
S

SlaterB

Gast
na das ist ja auch schon bisschen was anderes, im InputStream müssen nur die Daten in ihrer Gesamtheit gecacht werden,
wenn man dort herumspringt und von woanders liest ist fast nix zu ändern außer einem Index,
da kann man x-mal vor und zurück springen, die gelesenen Daten, Positionen usw. sind immer konstant

dagegen in eine bestehene Folge von 1000 Bytes 10 einfügen?
da muss man ja erstmal 500 weiter nach rechts schieben, Platz schaffen,
wenn man einmal etwas eingefügt hat ändert sich die Position aller folgenden Daten, weitere Markierungen/ Resets haben auf einmal eine andere Wirkung,
sowas ist eben anscheinend nicht vorgesehen

Tipp: verwende eine Liste, ein der du alle TeilStrings, Integer-Objekte und was du noch so hast einfügst,
die Liste stört sich nicht an Änderungen, von mark/ rest ist dort aber natürlich auch nicht die Rede,
musst dir schon selber merken, wo der Header hinkommt,

am Ende schreibst du alles aus der Liste in den Stream,
ach, könnte etwas nervig werden, da die richtigen Operationen zu finden
(wenn Integer, dann verwende writeInt() usw)

hast du denn überhaupt unterschiedliche Daten oder vielleicht gar nur Strings?
ein StringBuilder erlaubt auch append und beliebiges Insert,
vielleicht im Programm so nur einen großen Text zusammenbauen und den am Ende schreiben?
 

Ishildur

Bekanntes Mitglied
Hallo Slater, ich fürchte du hast mich falsch verstanden
Ich hatte natürlich vor, den Platz für den Header auszusparen und schliesslich einfach ab und zu mit dem Filezeiger in den Header zurück springen, um dort einen nun verfügbare Information zu hinterlegen. Ich speichere ganz unterschiedliche Objekte, welche auch ganz unterschiedlich grössen haben bspw. Objekte mit unterschiedlich vielen Parametern usw.
Nun will ich im Header eine Tabelle hinterlegen, in welcher die Offsets der Position jener Objekte innerhalb der Datei gespeichert ist. Die grösse des Headers kenne ich, weil ich ja natürlich die Anzahl Objekte innerhalb meiner Listen kenne und ich für jeden Offset 4 Bytes reservieren muss. Das Problem ist nun, dass ich natürlich die Grösse der einzelnen Objekte nicht kenne, solange ich diese nicht in einer Schleife durchlaufe und analysiere. Natürlich kann ich alle Objekte zweimal durchlaufen, aber es wäre natürlich einfacher, wenn ich nach jedem gesicherten Objekt die aktuelle Position des Dateizeigers an der ensprechenden Stelle im Header (im dafür reservierten Platz) zu platzieren. Das Problem ist ja auch, dass ich nicht zuverlässig berechnen kann, wieviel Platz ein writeUTF effektiv in der Datei verwendet, da dies ja nur im günstigsten Fall mit Stringlänge+2 übereinstimmt!

Ich bin gerade echt ratlos, ich hoffe du kannst mich hierbei unterstützen :)
 
S

SlaterB

Gast
hmm, ich versthe dich nun noch weniger,

ein DataOutputStream ist meiner Meinung nach etwas, wo man Strings, ints und sonstwas in einer bestimmten Reihenfolge reinschreibt,
und da es ist nunmal nicht möglich, nach dem Schreiben noch etwas an vorheriger Position zu schreiben

die Sache meinst du anscheinend nicht, ist aber die einzige, die ich mir vorstellen kann,
ansonsten kann man doch praktisch gar nicht mehr mit diesem Stream machen, auch theoretisch nicht wünschen ;)

was das auf einmal mit Objekten, Offsets, Platz reservieren, doppelten Schleifendurchlauf, aktuelle Position und sonstwas zu tun hat,
verstehe ich persönlich nicht
 

Ishildur

Bekanntes Mitglied
@Slater
ein DataOutputStream ist meiner Meinung nach etwas, wo man Strings, ints und sonstwas in einer bestimmten Reihenfolge reinschreibt,

Richtig, das ist genau das, was ich mache! Allerdings möchte ich am anfang der Datei ein Array mit den Offsets sämtlicher gespeicherter Objekte speichern, damit ich diese später sehr effizient laden kann.

Stell dir mal vor, ich habe 30 Levels mit seeeehhhr unterschiedlichen Grössen. Wenn ich nun den 25sten Level laden möchte, dann müsste ich vorher sämtliche 24 vorherigen Levels auch laden, damit ich schliesslich nach tausenden von readInts und readBytes und readUTFs usw. endlich an der Position vom 25. Level gelange.

OOOOOODDERRRR

Ich speichere im Header ein array von 25 Integers, in welchem die Offsets (Position) der einzelnen Levels innerhalb der Datei gespeichert ist, damit ich beim Ladevorgang direkt zum gewünschten Level springen kann.

Das Problem ist nun, dass ich bei 30 Levels zwar weiss, wieviel Platz ich am Anfang der Datei reservieren muss (nämlich 30*4Bytes). Ich speichere den ersten Level also nicht bei Position null sondern bei Position 30*4. Allerdings kann ich ja erst mit Sicherheit sagen, wieviel Platz denn nun ein Level in der Datei benötigt, nachdem ich ihn gespeichert habe, weil bspw. die Methode writeUTF() abhängig von den effektiven Zeichen unterschiedlich viel Speicherplatz benötigt.

Also ich schreibe das mal als Pseudocode

Array level // array of levels
offset // current offset inside the file (filepointer)

skip(30*4) // leave space for the header

// start a loop for walking each level
for i <- 0 to level.length do
write level // write the current level
offset <- tell // save the current position of the filepointer
mark // sadly only works in DataInputStream
seek(i*4) // move the filepointer to the appropriate position inside the header
write offset // write the current offset
reset // return to write the next level
end for
 
S

SlaterB

Gast
jetzt bist du wieder am Anfang:
du schreibst erst etwas in den Stream und später willst du was an den Anfang schreiben,
dass du das nur machst, weil du den Offset nicht kennst und dass du schon Platz reserviert hast sind dabei zwei wenig relevante Details

ich persönlich sehe da auf die Schnelle keine gute Lösung,
um die Datei im Nachhinein zu bearbeiten gibts noch RandomAccessFile,
aber da müsstest du schon genau wissen wohin du nun den Index schreiben musst,
quasi den Index von der Stelle für den Index kennen ;)
evtl. denkbar aber nicht gerade super

oder eine zweite Datei für die Indexe, klingt erstmal sauberer aber da ist ja überhaupt die Sache mit den Indexen, die so nicht sehr schön ist

schon mal von einer DB gehört? ;)
 

Ishildur

Bekanntes Mitglied
@Slater
schon mal von einer DB gehört?
Also wieviele Spiele speichern die Leveldateien in einer Datenbank? :wink:

Und wenn du das mit den Indexen nicht sauber findest, dann sind wohl sämtliche Dateisysteme "nicht sauber"... :lol:
 

Ishildur

Bekanntes Mitglied
Hmm ich habe festgestellt, dass die RandomAccessFile Klasse genau das kann, was ich brauche und zusätzlich sämtliche Funktionen von DataOutputStream besitzt. Da frage ich mich doch, wieso sollte man überhaupt DataOutputStream verwenden resp. was sind die Unterschiede sowie Vor- bzw. Nachteile der beiden Klassen?

Lg Ishildur
 
S

SlaterB

Gast
File klingt nach File, Stream nach Stream, der ist allgmeiner

wenn ein Stream etwas was ins Internet versendet, dann wirds nunmal nix mit nachträglicher Änderung
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3
Max246Sch Backtracking Problem Box Filler Allgemeine Java-Themen 6
NightVision402 VisualVM Startskript Problem Allgemeine Java-Themen 3
javaBoon86 Email Server Connection Problem Allgemeine Java-Themen 1
F Problem mit PDFBOX Library Allgemeine Java-Themen 1
A Java modul Problem Allgemeine Java-Themen 4
D Read JSON File Problem Allgemeine Java-Themen 9
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
J Problem mit JasperReports Allgemeine Java-Themen 8
M log4j Problem mit jlink Allgemeine Java-Themen 19
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
P Selenium . getText Problem Allgemeine Java-Themen 9
A Jar zu Exe Problem Allgemeine Java-Themen 13
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
A Thread.sleep Problem Allgemeine Java-Themen 2
A Problem bei der Nachbarschafttest Allgemeine Java-Themen 11
Splayfer Problem: no main manifest attribute Allgemeine Java-Themen 3
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
Splayfer JDA Problem mit MessageCounter Allgemeine Java-Themen 0
Splayfer Problem mit BufferedWriter Allgemeine Java-Themen 3
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
N Maven Problem mit Datenbanktreiber (H2 Embedded) Allgemeine Java-Themen 12
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
C ArrayList Problem Allgemeine Java-Themen 3
kev34 nim-Spiel problem Allgemeine Java-Themen 1
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
G Welches Problem besteht bei den Typparametern? Allgemeine Java-Themen 5
temi Problem mit Aufrufreihenfolge bei Vererbung Allgemeine Java-Themen 3
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
T PIM basierend auf netbeans via AnyDesk Problem Allgemeine Java-Themen 3
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
Kirby.exe Verständnis Problem bei Rucksack Problem Allgemeine Java-Themen 6
B Eclipse-Lombok-Problem Allgemeine Java-Themen 19
I Input/Output ObjectOutputStream - Problem Allgemeine Java-Themen 7
1 Multiple Choice Knapsack- Problem Allgemeine Java-Themen 2
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
E Problem mit Gridlayout und Button Allgemeine Java-Themen 2
A Array Problem Allgemeine Java-Themen 8
bueseb84 Problem Allgemeine Java-Themen 0
S Problem mit Arrays Allgemeine Java-Themen 1
D Nullpointer Exception Problem Allgemeine Java-Themen 5
B Problem mit meinen Klassen Allgemeine Java-Themen 6
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
J Problem bei Install java 13 Allgemeine Java-Themen 3
X Profitable Reise Problem Allgemeine Java-Themen 32
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
Dann07 Problem mit JavaMail API Allgemeine Java-Themen 26
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
J Clear-Problem Allgemeine Java-Themen 10
B Problem zu einem Java Projekt Allgemeine Java-Themen 6
S JFileChooser Problem Allgemeine Java-Themen 4
M Traveling Salesman - MST Heuristik Problem Allgemeine Java-Themen 4
J Traveling Salesman Problem Allgemeine Java-Themen 14
E Java Editor Problem mit 2er Exceptions Allgemeine Java-Themen 12
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
S Methoden Problem mit NullPointerException Allgemeine Java-Themen 9
Javafan02 Problem mit if-clause Allgemeine Java-Themen 17
J Lombok Problem mit Konstruktoren bei Verberbung Allgemeine Java-Themen 1
kodela Event Handling Problem mit der Alt-Taste Allgemeine Java-Themen 16
W Threads Problem Allgemeine Java-Themen 15
D (Verständnis-)Problem mit Unterklasse Allgemeine Java-Themen 4
S Problem mit Generic bei unmodifiableCollection Allgemeine Java-Themen 4
S jserialcomm Problem Allgemeine Java-Themen 1
Flynn Thread-Problem... Allgemeine Java-Themen 2
J Generische Interface - Problem Allgemeine Java-Themen 3
G Problem beim GUI Allgemeine Java-Themen 9
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
T Problem mit externen Datenbankzugriff über SSH Tunnel Allgemeine Java-Themen 4
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
S Java OpenOffice Problem mit Windows-Benutzerwechsel Allgemeine Java-Themen 19
K Threads RAM Problem Allgemeine Java-Themen 20
P Operatoren Problem mit Zähler in recursiver Schleife Allgemeine Java-Themen 2
C Int Problem Allgemeine Java-Themen 8
C J2V8 NodeJs Java Bride Problem und Frage!?!? Allgemeine Java-Themen 1
J Problem bei Hashmap Key-Abfrage Allgemeine Java-Themen 4
C Webseiten Programm problem Allgemeine Java-Themen 5
M LocalDate Problem Allgemeine Java-Themen 4
J "Problem Objektorientierung" Allgemeine Java-Themen 20
geekex Problem Meldung! Was tun?! Allgemeine Java-Themen 19
T Klassen Override Problem Allgemeine Java-Themen 7
L Unbekanntes Problem Allgemeine Java-Themen 1
FrittenFritze Problem mit einer JComboBox, Event temporär deaktivieren Allgemeine Java-Themen 11
Blender3D Java Swing Programm Windows 10 Autostart Problem Allgemeine Java-Themen 2
F HTTPS Zertifikat Problem Allgemeine Java-Themen 3
M OpenCV KNearest Problem Allgemeine Java-Themen 0
Tommy Nightmare Project Euler: Problem 22 Allgemeine Java-Themen 2
C Abstrakte Klasse, lokale Variable-Problem Allgemeine Java-Themen 1
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
P Eclipse Projekt anlegen macht Problem Allgemeine Java-Themen 1
RalleYTN META-INF/services Problem Allgemeine Java-Themen 3
F Java Mail Problem: Authentifizierung wird nicht immer mitgeschickt Allgemeine Java-Themen 1
I Problem beim Aufrufen, von Objektmethoden/ -variablen Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben