Daten zufällig Einlesen aus einer Datei (binäres Format)

Michelangelo

Mitglied
Hallo,
ich sitze nun seit vielen Stunden an einer Aufgabe und brauche mal wieder einen Denkanstoß.

Ändern Sie das Hangman-Spiel so, dass das Wort nicht mehr zufällig aus einem Array ermittelt wird, sondern aus der Datei, die Sie mit den Methoden datenLesen()/datenSchreiben erstellt haben. Das Wort soll aber nach wie vor zufällig ermittelt werden.

Was mir klar scheint:
1)Es soll ein Wahlfreier Zugriff auf dieser Datei erfolgen.
2) Benötigt wird eine Variable die die Positionierung angibt.
3) Mittels der Klasse Random ist es möglich eine zufällige Zahl an die Variable(für Positionierung) zu übergeben.
Hierbei ist erforderlich: Das der Start für den Zugriff an der Position 4(Byte) beginnt, da auf den vorherigen Bytes die Daten(Zahlen) der Positionierungen befinden.


Mein Problem: Ich habe mir lange Zeit den Kopf zerbrochen und egal was mir auch eingefallen ist( und ich bin kreativ :))
nichts hat mich annähernd zu meiner Lösung gebracht. Entweder wurde Nur der Wert/Stelle der Positionierung zufällig ausgegeben mit jeweils des ersten geschriebenen Wort der Datei. Oder es kam Hauptsächlich Datenmüll beim Zugriffsversuch raus.
Wie kriege ich es hin, dass ich den "Zufallsgenerator" auf bestimmte Werte eingrenzen kann?

Folgend ist mein code mit der Methode datenZufällig().
Java:
public void datenZufall() {
        try(RandomAccessFile datei = new RandomAccessFile("woerter.bin", "r")) {
            //für das Positionieren
            long zufall = 0;
            Random i = new Random();
//10 Werte sollen abgedeckt sein
            zufall = i.nextLong(10);   
            //ist die neue Position gültig?
            if (zufall <= datei.length()-4)
                //dann positionieren
                datei.seek(zufall);
                //lesen und anzeigen
                add(new JLabel("Wert an Position: " + zufall));
                add(new JLabel(datei.readUTF()));
                //zahl.setText(Integer.toString(anzahlWoerter));
            pack();
        
         }           
            catch (IOException e) {
                JOptionPane.showMessageDialog(this, "Beim einlesen ist ein Problem aufgetreten");
                 e.printStackTrace();
            }
        }


Über jede hilfreiche/Lehrreiche Antwort bedanke ich mich schon mal im vorraus.
 

KonradN

Super-Moderator
Mitarbeiter
Das Problem ist erst einmal, dass Du eben nicht über einen wahlfreien Zugriff auf das Wort zugreifen kannst.

Wie bei einer einfach verketten Liste musst Du von Anfang an durch die Datei durchgehen, um zu dem Wort zu kommen.

Das sind die Einschränkungen, die Du hast. Du kannst also nur über die Anzahl der Worte gehen um dann per Zufallszahl ein Wort auszuwählen. Und dann musst Du die Worte so lange einlesen, bis Du bei dem gewünschten Wort bist.

Wenn Du dies nicht willst, dann kannst Du es dir auch noch erweitern: Zu der Datei mit den Worten schreibst Du auch noch eine idx Datei. Immer wenn Du ein Wort schreibst, schreibst Du in diese Datei die Position, an die Du das Wort geschrieben hast.

Dann kannst über den Index gezielt den Startpunkt aus der idx Datei lesen und dann über diesen Startpunkt dann in der Wortdatei das Wort lesen.

(Das wäre doch eine super Übung, oder?)
 

Michelangelo

Mitglied
Das Problem ist erst einmal, dass Du eben nicht über einen wahlfreien Zugriff auf das Wort zugreifen kannst.

Wie bei einer einfach verketten Liste musst Du von Anfang an durch die Datei durchgehen, um zu dem Wort zu kommen.

Das sind die Einschränkungen, die Du hast. Du kannst also nur über die Anzahl der Worte gehen um dann per Zufallszahl ein Wort auszuwählen. Und dann musst Du die Worte so lange einlesen, bis Du bei dem gewünschten Wort bist.

Wenn Du dies nicht willst, dann kannst Du es dir auch noch erweitern: Zu der Datei mit den Worten schreibst Du auch noch eine idx Datei. Immer wenn Du ein Wort schreibst, schreibst Du in diese Datei die Position, an die Du das Wort geschrieben hast.

Dann kannst über den Index gezielt den Startpunkt aus der idx Datei lesen und dann über diesen Startpunkt dann in der Wortdatei das Wort lesen.

(Das wäre doch eine super Übung, oder?)
Hallo KonradN,
vielen Dank für deine Nachricht.

Es ist also nicht möglich eine Variable als Zeiger zu benutzen, welche ein "Zufallsgenerator" übergeben bekommt?!
Im meinem Studienheft bearbeiten wir XML, txt, bin Dateien.
In dem Studienheft wird mit den Klassen FileWriter/-Reader und RandomAccessFile gearbeitet und ich glaube, dass es so gewollt ist das man
mit diesen Klassen arbeitet.
Andernfalls könntest du mir das anhand eines Bsp. erklären wie du das meinst mit ZITAT: Du kannst also nur über die Anzahl der Worte gehen um dann per Zufallszahl ein Wort auszuwählen. Und dann musst Du die Worte so lange einlesen, bis Du bei dem gewünschten Wort bist.

Die Klasse RandomAccessFile ist auch wirklich kompliziert -.-
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Zumindest nicht sinnvoll. Denn du musst wirklich ein Wortanfang treffen.

Du hast z.B. 7 Worte und eine Dateilänge von 83 Bytes.

Du hast ja keine Information, an welchen Stellen die Worte anfangen. Nur beim ersten Wort kennst du den Anfang.

Wenn man die Worte nicht lesen will, dann könnte man auch nur die ersten zwei Byte als Zahl lesen. Das wäre die Länge des Strings. Dann könnte man einfach von Wort zu Wort springen ohne die Worte selbst zu lesen.

Vom Aufwand her macht das aber keinen Unterschied.
 

Neumi5694

Top Contributor
Wenn die Datensatzlänge nicht fix ist, kommst du um sequentielles Einlesen nicht rum.
Dabei ist ein gebufferter Zugriff schneller als viele einzelne kleine, bis du zum richtigen Ergebnis kommst. Ob du nun z.b. 20 Bytes einliest oder z.B. 4k ist beides genau gleich schnell, wenn das der Blockgröße der Partition entspricht.

Für das Zugreifen auf bestimmte Bytes innerhalb der Datei wird FileChannel anstatt RandomAccessFile empfohlen. RAF ist ziemlich langsam.
 

KonradN

Super-Moderator
Mitarbeiter
Dabei ist ein gebufferter Zugriff schneller als viele einzelne kleine, bis du zum richtigen Ergebnis kommst. Ob du nun z.b. 20 Bytes einliest oder z.B. 4k ist beides genau gleich schnell, wenn das der Blockgröße der Partition entspricht.
Wobei das System das schon übernehmen sollte. Daher ist das ein gutes Beispiel, dass man keine Optimierungen machen soll.

Das System liest Blöcke - das System kann also nicht nur 8 Bytes lesen sondern es wird direkt ein Block von der Platte gelesen und damit hast Du direkt 1, 2, 4, 8, ... K Daten. Bei meinem Raid würden es gleich 32K Daten sein, die das System bekommt.

Beware of Premature Optimization​



Warum?
Optimierungen kosten immer viel Aufwand. Wer Vorsicht walten lässt, spart oft wertvolle Ressourcen für das, was dem Kunden wirklich nützt.
 

mihe7

Top Contributor
Es ist also nicht möglich eine Variable als Zeiger zu benutzen, welche ein "Zufallsgenerator" übergeben bekommt?!
Doch, aber Du müsstest Dir dafür ein geeignetes Dateiformat überlegen.

Beispielsweise könntest Du die Wörter aufeinanderfolgend in die Datei schreiben, sagen wir mal Du bräuchtest dafür x Bytes, dann würde den Wörtern ein Verzeichnis folgen:

OffsetLängeInhalt
x40 (= Offset 1. Wort)
x+44Offset 2. Wort
...jeweils 4...
x+4*(n-1)4Offset n-tes Wort
x+4*n4x

Um damit auf das j-te Wort zuzugreifen, liest Du die letzten 4 Bytes der Datei ein, die den Offset (vom Dateianfang gesehen) auf den ersten Verzeichniseintrag enthalten. Der Offset entspricht x. Den musst Du nur einmal einlesen.

Anhand von x berechnest Du nun den Offset des Index-Eintrags, also x + 4*(j-1) und liest den Eintrag (4 Bytes) und den Folgeeintrag (4 Bytes) ein. Der erste der beiden Einträge enthält die Position des Worts in der Datei, die Differenz der beiden Einträge liefert die Wortlänge.

Das wäre ein erster Ansatz, der sich natürlich ausbauen lässt. Wenn Speicher eine untergeordnete Rolle spielt, kannst Du auch die Wortlänge vor jedes Wort schreiben (1 Byte), dann brauchst Du nur einen Eintrag aus dem Index zu lesen. Weiter könnte man die Datei in Seiten unterteilen, dann würde man komplette Seiten einlesen usw.
 

KonradN

Super-Moderator
Mitarbeiter
Bezüglich der Idee von @mihe7 nur ein kleiner Hinweis:
Die Methode, die den String in die Datei schreibst, schreibt bereits die Länge des Strings mit in die Datei (in 2 bytes).

Wenn also z.B. "aaa" mit writeUTF geschrieben wurde, dann wurde in die Datei geschrieben:
0x00 0x03 0x61 0x61 0x61

Die Wortlänge wird somit bereits vor jedes Wort geschrieben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H JTabel - RowFilter Daten für Berechnung filtern AWT, Swing, JavaFX & SWT 6
W Nullpointer Exception beim übertragen von Daten von Scene zu Scene AWT, Swing, JavaFX & SWT 6
W Daten von Controller zu Controller übertragen AWT, Swing, JavaFX & SWT 7
D Columns unabhängig voneinander mit Daten füllen JavaFx AWT, Swing, JavaFX & SWT 1
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
T Anbinden der Tabelle an die Daten AWT, Swing, JavaFX & SWT 5
F JavaFX Tabelle mit Daten füllen AWT, Swing, JavaFX & SWT 9
A JavaFX Daten in eine HTML-Table mit JS schreiben AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Daten zwischen Controllern austauschen- neue Frage AWT, Swing, JavaFX & SWT 7
ralfb1105 JavaFX Daten zwischen Controller "austauschen" AWT, Swing, JavaFX & SWT 65
B AWT Bot um Daten auf Website einzugeben und die Antwort zu bekommen AWT, Swing, JavaFX & SWT 2
L Daten bearbeiten ohne GUI zu blockieren - daten haltung/zurück geben AWT, Swing, JavaFX & SWT 15
ralfb1105 Swing JComboBox update der Daten AWT, Swing, JavaFX & SWT 8
ralfb1105 Swing Dynamischer Graph zum anzeigen Perfomance Daten AWT, Swing, JavaFX & SWT 35
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
K TreeTableView (cellFactory) - wie Daten in Spalten einfügen AWT, Swing, JavaFX & SWT 0
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
J TableView Daten werden nicht ausgegeben AWT, Swing, JavaFX & SWT 9
A Swing Wie Daten in der Form speichern? Array oder ArrayList AWT, Swing, JavaFX & SWT 2
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
T JavaFX Model Daten übergeben AWT, Swing, JavaFX & SWT 4
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
J JavaFX Tableview Daten hinzufügen aus anderer Klasse AWT, Swing, JavaFX & SWT 7
J Tableview Daten hinzufügen und aktualisieren AWT, Swing, JavaFX & SWT 5
S AWT Daten über TextField und Button in array speichern AWT, Swing, JavaFX & SWT 5
G Event Handling TableView daten in ein neues Fenster herauslesen? AWT, Swing, JavaFX & SWT 3
S JavaFX (Best Practise) Daten zwischen Controllern austauschen AWT, Swing, JavaFX & SWT 1
thet1983 JavaFX TableView Objekt Daten anzeige AWT, Swing, JavaFX & SWT 2
L JavaFX Verzögerung beim Laden von Daten AWT, Swing, JavaFX & SWT 6
L Daten in neuem Fenster AWT, Swing, JavaFX & SWT 2
Tort-E JavaFX Daten an WebView Komponente AWT, Swing, JavaFX & SWT 1
I JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen AWT, Swing, JavaFX & SWT 4
S JTable Daten aus Array AWT, Swing, JavaFX & SWT 9
M Java FX Daten an Controller übergeben AWT, Swing, JavaFX & SWT 3
S JList ist leer, aber DefaultListModel hat die Daten? AWT, Swing, JavaFX & SWT 9
M JavaFX Von FXML-Controllerdatei Daten zurückgeben AWT, Swing, JavaFX & SWT 6
F JavaFX Daten aus Tabelle in ComboBox AWT, Swing, JavaFX & SWT 9
B Swing JTable mit Daten - Reihen-Größe anpassen AWT, Swing, JavaFX & SWT 0
D Applet GWT speichert Daten nicht in Datenbank AWT, Swing, JavaFX & SWT 2
S SWT In Listen den Einträgen Daten zuordnen AWT, Swing, JavaFX & SWT 2
T SWT Table (mit Spinner Spalte) Daten auslesen AWT, Swing, JavaFX & SWT 4
F Swing JTable: Daten voreinstellen AWT, Swing, JavaFX & SWT 4
B Daten in eine JTable schreiben AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
J valueChanged()-Methode liefert unbrauchbare Daten AWT, Swing, JavaFX & SWT 4
B Datenübergabe zwischen Tabs und Daten speichern AWT, Swing, JavaFX & SWT 2
D SWT TreeViewer: Daten aus Model gelöscht... trotzdem noch im Baum AWT, Swing, JavaFX & SWT 4
D Daten von JDialog an JTable in JFrame übergeben AWT, Swing, JavaFX & SWT 7
O JTable zeigt die alte Daten wieder AWT, Swing, JavaFX & SWT 23
H JTable zeigt keine Daten an AWT, Swing, JavaFX & SWT 5
M Swing Daten von JPanel zu JFrame senden AWT, Swing, JavaFX & SWT 13
C Swing JTable Daten einfügen AWT, Swing, JavaFX & SWT 6
Ollek IndexOutOfBoundsException bei neuen Daten in JTable AWT, Swing, JavaFX & SWT 13
J Swing JTable-Daten Speichern und bei zeilen-änderung beibehalten. AWT, Swing, JavaFX & SWT 6
A Daten umherschieben zwischen zwei Klassen AWT, Swing, JavaFX & SWT 40
L [SWT] Daten und Bilder drucken AWT, Swing, JavaFX & SWT 2
M Trotz richtiger Daten, falsches Bild wird gezeichnet?! AWT, Swing, JavaFX & SWT 4
O JFrame: Daten alle paar Sekunden aktualisieren AWT, Swing, JavaFX & SWT 3
C Daten aus DB -> JTable aktualisieren klappt nicht AWT, Swing, JavaFX & SWT 16
A Swing(Daten zugreifen) AWT, Swing, JavaFX & SWT 25
S JComboBox - veränderliche Daten AWT, Swing, JavaFX & SWT 6
T Daten mittels ComboBox in ein JTable adden AWT, Swing, JavaFX & SWT 7
Ollek Realisierung: JTable zur Laufzeit mit neuen Daten füllen AWT, Swing, JavaFX & SWT 3
GianaSisters Swing jTable Daten unsichtbar AWT, Swing, JavaFX & SWT 12
T JTree Daten in DB schreiben am besten SQL AWT, Swing, JavaFX & SWT 21
W Daten auf Textfeld in anderer Klasse verwenden AWT, Swing, JavaFX & SWT 4
T Daten der gesamten Woche anzeigen AWT, Swing, JavaFX & SWT 2
D Problem mit JFileChooser -> Daten werden mit anführungsstriche in JTable geschrieben AWT, Swing, JavaFX & SWT 8
H JList zeigt die Daten aus dem Array nicht an! AWT, Swing, JavaFX & SWT 13
E Daten von JDialog nach JFrame übertragen AWT, Swing, JavaFX & SWT 4
K TableModel mit Daten aus Datenbank füllen AWT, Swing, JavaFX & SWT 7
M JTree mit eigenen Knoten - Zugriff auf Daten AWT, Swing, JavaFX & SWT 6
L Swing Daten in JTable aktualisieren AWT, Swing, JavaFX & SWT 5
H Swing Tabelle nach Klick auf Button mit Daten füllen? AWT, Swing, JavaFX & SWT 2
B Swing JList Daten löschen AWT, Swing, JavaFX & SWT 13
R Swing XML Datei in JTree, Problem mit Daten einlesen AWT, Swing, JavaFX & SWT 34
A SWT: Daten in Raster mit Gitternetzlinien darstellen AWT, Swing, JavaFX & SWT 7
C Swing JTextField-Daten über mehrere Dialoge AWT, Swing, JavaFX & SWT 18
K TableModel Daten übergeben AWT, Swing, JavaFX & SWT 9
Milady Swing Änderung von Daten mit sql AWT, Swing, JavaFX & SWT 2
J Daten aus einer Textdatei in ArrayList holen AWT, Swing, JavaFX & SWT 9
X Swing Daten aus Vector ins TableModel ?? AWT, Swing, JavaFX & SWT 12
T Swing Liste von Daten anzeigen AWT, Swing, JavaFX & SWT 4
S Swing Daten aus Datenbank in JTable AWT, Swing, JavaFX & SWT 2
E JCombobox mit Daten aus DB füllen AWT, Swing, JavaFX & SWT 9
L Daten werden in JTable nicht angezeigt:( AWT, Swing, JavaFX & SWT 6
Milady Annzeigen alle Daten aus der Tabelle AWT, Swing, JavaFX & SWT 6
P Swing Liste von Daten auf JFrame AWT, Swing, JavaFX & SWT 6
E Daten aus sortierter Tabelle lesen AWT, Swing, JavaFX & SWT 2
X Swing JList -> Daten anders darstellen als im Model hinterlegt -> möglich ? AWT, Swing, JavaFX & SWT 9
X Doppelte Daten in DefaultListModel unterbinden AWT, Swing, JavaFX & SWT 3
ModellbahnerTT SWT Daten zur nächsten WizardPage senden AWT, Swing, JavaFX & SWT 4
J Daten in JTable nach Sortierung auslesen AWT, Swing, JavaFX & SWT 2
hdi Swing JTable & Filtern: Daten nicht in der View AWT, Swing, JavaFX & SWT 2
S JTable Bug - eingegebene Daten werden falsch geparst :( AWT, Swing, JavaFX & SWT 4
L AWT Daten vom Dialog an Frame senden AWT, Swing, JavaFX & SWT 3
hdi Swing JTable: Löschen vom Daten im Model AWT, Swing, JavaFX & SWT 7
U JTable mit Daten aus einer HashMap füllen AWT, Swing, JavaFX & SWT 8
S Swing Bei Klick auf OK Daten übergeben AWT, Swing, JavaFX & SWT 6
A Daten aus einem Frame werden im nächsten nicht gesehen AWT, Swing, JavaFX & SWT 17

Ähnliche Java Themen

Neue Themen


Oben