Auf Inhalte aus Datei zugreifen

Projo96

Mitglied
Hallo zusammen,

ich hänge gerade an einer Aufgabe fest und kann jede Hilfe gebrauchen. Es geht darum, dass bei einem Hangman-Spiel die zu erratenen Worte nicht mehr aus einem Array sondern aus einer Datei ermittelt werden sollen. Die entsprechende Klasse zur Erstellung der Datei habe ich bereits und die Datei liegt auch in dem Projektordner.
Jetzt stehe ich allerdings auf dem Schlauch, wie ich die Methode für das Suchwort entsprechend abändern muss. Das Wort soll nach dem Zufallsprinzip ermittelt werden.

Das war die Methode vorher mit der Array Variante:

Java:
//die Methode ermittelt zufällig ein Wort
    private void neuesWort() {
        int zufall = 0;   
            
        //die Wortliste
        String[] woerter ={"Test", "Automobil", "Versuch", "Hund", "Katze",
                "Ziege", "Maus", "Elefant", "Isopropylalkohol", "Schwimmbad"};
        
        //ein zufälliges Wort ermitteln
        //dazu wird eine zufällige Zahl zwischen 0 und 1 ermittelt und mit der Länge von Wörter multipliziert
        zufall = (int)(Math.random() * woerter.length);
        
        //das Suchwort und die Zeichen für die Anzeige setzen
        suchwort = new String(woerter[zufall]);
        anzeige = new StringBuilder(suchwort);
        
        //alle Zeichen in der Anzeige ersetzen durch *
        for (int zeichen = 0; zeichen < suchwort.length(); zeichen++)
            anzeige.setCharAt(zeichen, '*');

        //die Sternchen anzeigen
        ausgabeText.setText(anzeige.toString());
    }

Und das war der Versuch die Wörter aus der Datei zu ermitteln:

Java:
private void neuesWort() {
        int zufall = 0;
        suchwort = "";
        // in dieser Variablen wird die Gesamtanzahl der Woerter gespeichert
        int anzahl = 0;
        // die Position für den Zeiger
        int position = 0;
        try (RandomAccessFile datei = new RandomAccessFile("HangmanWoerter.dat","r")){
            anzahl = datei.readInt();           
            while (zufall == 0)
                //per Zufall wird ein Wort ermittelt und der Variablen zufall zugeordnet.
                //kommt dabei 0 raus, wird nochmal gewürfelt.
                zufall = (int)(Math.random() * anzahl+1);           
            //Es wird nach der soeben ermittelten Position gesucht.
            while (datei.getFilePointer() < datei.length()) {
                //wenn die ermittelte Position mit dem int-Wert übereinstimmt,
                //wird das Wort der Variable suchwort zugeordnet
                if (datei.readInt() == zufall)
                    suchwort = datei.readUTF();
                //wenn nicht, dann den Namen überlesen
                else {
                    //die Länge beschaffen
                    position = datei.readUnsignedShort();
                    //die neue Postion ansteuern
                    datei.seek(datei.getFilePointer() + position);
                }
            }
            datei.close();
        }
        catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Fehler beim Wort laden");
        }
    }

Vielleicht könnt ihr mir helfen und einen Denkanstoß geben.

Danke und LG :)
Projo96
 

mihe7

Top Contributor
Das wird vermutlich wieder eine dieser Aufgaben sein wo RandomAccessFile vorgeschrieben ist, denke ich. Eventuell hilft es dann auch einfach auf die alten Themen dazu zu verweisen, zum Beispiel 'Worteditor mit Wortanzahl'.
Ja, daher hatte ich nach dem Format gefragt und den Lösungweg von @Nouser verallgemeinert: im Prinzip kann er immer alle Wörter einlesen, ganz egal, ob diese in einer DB, in einem Textfile oder einem RAF stehen :)

Aber klar: wenn tatsächlich ein RAF gefordert ist, wird sich der Aufgabensteller mit dieser Lösung wahrscheinlich nicht zufrieden geben...
 

Projo96

Mitglied
@Robert Zenz danke für die Verlinkung des anderen Themas. Ich habe mir das angeschaut und hatte eine neue Idee, da bei mir eine ähnliche Fehlermeldung auftauchte. Als ich das änderte, lief der Code, allerdings wurde immer nur die Exception ausgelöst, was eigentlich nicht passieren soll.

@mihe7 Es soll tatsächlich mit RandomAccessFile gemacht werden. Ich hatte es jetzt nochmal anders probiert. Leider klappt es so auch nicht.

Java:
private void neuesWort() {
            int zufall = 0;
            int woerter = 0;
            char woerter = "";
            //öffnen im Lesemodus
            try (RandomAccessFile datei = new RandomAccessFile("HangmanWoerter.dat", "r")) {
                woerter = datei.readChar();
                zufall = (int)(Math.random() * woerter+1);
                
                //das Suchwort und die Zeichen für die Anzeige setzen
                suchwort = woerter;
                anzeige = suchwort.toString();
                
                //alle Zeichen in der Anzeige ersetzen durch *
                for (int zeichen = 0; zeichen < suchwort.length(); zeichen++)
                    anzeige.setCharAt(zeichen, '*');

                //die Sternchen anzeigen
                ausgabeText.setText(anzeige.toString());
            }
        }

Ich weiß, dass da einige Fehler drin sind. Leider weiß ich nicht, wie ich es richtig machen soll und mit dem konvertieren von String, Int, Char usw. tue ich mich echt schwer.
 

Projo96

Mitglied
Mit Format ist der Aufbau der Datei gemeint, nicht die Dateiendung. Was steht wie in der Datei?
die Datei wird mit einer Klasse erstellt. Sie enthält dann die Wörter für das Hangman-Spiel, die erraten werden sollen.

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class HangmanEditor extends JFrame{
    private static final long serialVersionUID = 8977185940225537564L;
    //Ein Textfeld für die Worteingabe und Wörterausgabe
    private JTextArea feld, anzeige;
    //Die Buttons zum Speichern/Anzeigen und zum Beenden
    private JButton speichern, beenden;
    //diese Variable speichert den Namen der Datei
    private String dateiName;
    //wortAnzahl zeigt die Gesamtanzahl der Wörter an
    private JLabel wortAnzahl, wortEingabe;
    //hier werden die Anzahl der Wörter gespeichert
    private int wortZaehler;
    private JPanel panel;   
    
    public HangmanEditor(String titel) {
        super(titel);
        //Anzahl der Wörter wird erstmal auf 0 gesetzt
        wortZaehler = 0;
        // der Name der Datei
        dateiName = "HangmanWoerter.dat";
        // Das Erzeugen der GUI
        panel = new JPanel(new GridLayout(0,2));
        anzeige = new JTextArea();
        feld = new JTextArea();   
        //Button "speichern und anzeigen"
        speichern = new JButton("speichern und zeigen");
        //Action setzen
        speichern.setActionCommand("speichern");
        //Button "Beenden"
        beenden = new JButton("Beenden");
        //Action setzen
        beenden.setActionCommand("beenden");
        //zwei Label
        wortAnzahl = new JLabel("");
        wortEingabe = new JLabel("Wort eingeben:");                   
        
        //Listener erstellen
        Listener listener = new Listener();       
        speichern.addActionListener(listener);
        beenden.addActionListener(listener);
        
        //BorderLayout erstellen
        setLayout(new BorderLayout());
        //Elemente hinzufügen   
        panel.add(wortEingabe);
        panel.add(feld);       
        panel.add(speichern);       
        panel.add(beenden);       
        panel.add(new JLabel("Anzahl der Woerter: "));
        panel.add(wortAnzahl);       
        add(panel, BorderLayout.CENTER);
        add(anzeige, BorderLayout.SOUTH);
        //Das Ausgabefeld ist erstmal nicht sichtbar. Soll nur angezeigt werden, wenn auch Wörter geladen werden
        anzeige.setVisible(false);
        //prüfen, ob die Datei vorhanden ist
        dateiCheck();
        //Größe nicht verändern
        setResizable(false);
        //und packen
        pack();
        //Das Fenster soll in der Mitte des Bildschirms erscheinen
        Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
        double x = dimension.getWidth()/2 - this.getSize().getWidth()/2;
        double y = dimension.getHeight()/2 - this.getSize().getHeight()/2;
        setLocation((int)x, (int)y);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
    
    //der ActionListener
    class Listener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            //für das speichern
            if (e.getActionCommand().equals("speichern"))
                datenSchreiben();
            //für das beenden
            if (e.getActionCommand().equals("beenden"))
                System.exit(0);           
        }       
    }
    
    private void dateiCheck() {
        //Wenn die Datei vorhanden ist, wird diese geladen und die Wörter mit der Anzahl angezeigt.
        //Die Anzahl der Wörter muss beim Programmstart geladen werden, damit Anzahl nicht 0 ist (schon gespeicherte Wörter vorhanden)
        File file = new File(dateiName);
        if (file.exists() == true)
            datenLesen();
        else
            //Wenn keine Datei vorhanden ist, haben die Wörter keine Anzahl
            wortAnzahl.setText("keine");
    }
    
    private void datenLesen() {
        //das Textfeld für die Wortausgabe wird sichtbar gemacht
        anzeige.setVisible(true);
        //das Textfeld soll wieder editierbar sein, um die Wörter zu schreiben
        anzeige.setEditable(true);
        //geladene Wörter gespeichern
        String woerter = "";
        //Wörter numerisch geordnet
        String anzahlWoerter ="";
        
        try(RandomAccessFile datei = new RandomAccessFile(dateiName,"r")){
            //gesamte Anzahl der Wörter laden, damit diese nicht mehr den Wert 0 haben
            //und damit die ersten 4 Bytes gelesen werden
            wortZaehler = datei.readInt();       
            //Wörter in while-Schleife laden           
            while (datei.getFilePointer() < datei.length()) {               
                anzahlWoerter = Integer.toString(datei.readInt());               
                woerter = woerter+anzahlWoerter+". " + datei.readUTF() +"\n";                                   
            }
            //Datei schliessen
            datei.close();
        }
        catch (IOException e) {
            JOptionPane.showMessageDialog(this,"Fehler beim Woerter laden");
        }
        //Anzahl der Wörter in einem Label ausgeben
        wortAnzahl.setText(Integer.toString(wortZaehler));
        //Wörter im Textfeld ausgeben
        anzeige.setText(woerter);
        //nicht editierbar damit nur geladene Wörter im Textfeld ausgegeben werden
        anzeige.setEditable(false);
        //und packen
        pack();
    }
    
    private void datenSchreiben() {
        //Wenn im Textfeld nichts eingegeben wurde, wird die Methode wieder verlassen
        if (feld.getText().isEmpty())
            return;       
    
        try (RandomAccessFile datei = new RandomAccessFile(dateiName,"rw")){
            //die Gesamtanzahl der Wörter um 1 erhöhen.
            wortZaehler++;
            //Die Gesamtanzahl der Wörter werden am Anfang der Datei gespeichert bzw. überschrieben           
            datei.writeInt(wortZaehler);
            //den Zeiger am Ende der Datei setzten
            datei.seek(datei.length());
            //Am Ende der Datei die aktuelle Gesamtanzahl der Wörter speichern           
            datei.writeInt(wortZaehler);
            //das Wort speichern
            datei.writeUTF(feld.getText());
            //Datei schliessen
            datei.close();
        }
        catch (IOException e) {
            JOptionPane.showMessageDialog(HangmanEditor.this, "Fehler beim Wort speichern");
        }
        //Eingabefeld leeren
        feld.setText("");
        //Focus setzen, um das nächste Wort einzugeben
        feld.requestFocus();
        //Wenn eine gespeicherte Datei vorhanden ist, wird diese gleich geladen
        File file = new File(dateiName);
        if (file.exists() == true)
            datenLesen();
    }

    public static void main(String[] args) {
        // TODO Automatisch generierter Methodenstub
        new HangmanEditor("Hangman Editor");
    }
}
 

mihe7

Top Contributor
die Datei wird mit einer Klasse erstellt. Sie enthält dann die Wörter für das Hangman-Spiel, die erraten werden sollen.
Du schreibst beim Hinzufügen die Anzahl der Wörter a) an den Dateianfang und b) vor jedes Wort, d. h. die ersten 4 Bytes gibt die Anzahl der Wörter in der Datei an, danach kommt eine 1, ein Wort, eine 2, ein Wort, eine 3, ein Wort usw. D. h. Du schreibst die Ordinalzahl vor jedes Wort.

In Deinem Ur-Posting ignorierst Du beim Lesen aber die Ordinalzahl (s. Zeilen 22 bis 25), so dass diese (bzw. zwei Byte davon) als position gelesen wird.
Java:
                    //die Länge beschaffen
                    position = datei.readUnsignedShort();
                    //die neue Postion ansteuern
                    datei.seek(datei.getFilePointer() + position);
Das ist natürlich falsch.

Übrigens: Du verwendest try-with-resources (wie sich das gehört ;)); das explizite Schließen der Datei ist damit überflüssig.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B JPanel-Inhalte inkl. JTextarea zoomen? AWT, Swing, JavaFX & SWT 3
S JavaFX ListView Inhalte während Laufzeit ändern AWT, Swing, JavaFX & SWT 23
M Inhalte einer FlowPane AWT, Swing, JavaFX & SWT 4
I JAVAFX - Übergabe der Inhalte an eine Scene - Wo ist der Vorteil gegenüber Swing? AWT, Swing, JavaFX & SWT 2
G Swing Wenn ich mein JFrame Fenster vergrößere die Inhalte anpassen AWT, Swing, JavaFX & SWT 1
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
Sugan Inhalte mit Threads ändern -> java.lang.IllegalStateException AWT, Swing, JavaFX & SWT 6
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
thobren JavaFX Inhalte aus dynamischen vbox mit TextArea auslesen AWT, Swing, JavaFX & SWT 9
J Swing unterschiedliche Inhalte in einem JFrame AWT, Swing, JavaFX & SWT 3
V kann ich in einer Klasse stage und scene deklarieren, aber in anderen Klassen Inhalte hinzufügen ? AWT, Swing, JavaFX & SWT 5
OnDemand Box Inhalte rechsbündig AWT, Swing, JavaFX & SWT 6
I JTable Inhalte löschen ohne den JTable zu verändern! AWT, Swing, JavaFX & SWT 5
S Swing Inhalte von Scroll-Panes werden nicht gezeichnet AWT, Swing, JavaFX & SWT 9
E Swing JTable Inhalte löschen..Was ist Sinnvoll? AWT, Swing, JavaFX & SWT 5
R Tab-Inhalte aktualisieren AWT, Swing, JavaFX & SWT 4
F Swing jScrollPane Inhalte AWT, Swing, JavaFX & SWT 2
M Datenbanktabellen Inhalte in JLabel anzeigen AWT, Swing, JavaFX & SWT 2
T Problem mit der Programmierung von Fenster und deren Inhalte AWT, Swing, JavaFX & SWT 4
M Platzhalter: Inhalte nicht vergrößern AWT, Swing, JavaFX & SWT 2
L Alle Inhalte in BorderLayout.CENTER löschen? AWT, Swing, JavaFX & SWT 2
R Manchmal werden die Inhalte des JFrames nicht angezeigt AWT, Swing, JavaFX & SWT 3
S JDialog und 'Inhalte' schliessen bzw. leeren AWT, Swing, JavaFX & SWT 9
O Inhalte in JTable löschen AWT, Swing, JavaFX & SWT 3
C JList Inhalte abfragen AWT, Swing, JavaFX & SWT 2
G GUI - Inhalte wechseln (Eingabe-Assistenten programmieren) AWT, Swing, JavaFX & SWT 2
C Inhalte in immer das gleiche Fenster ausgeben? AWT, Swing, JavaFX & SWT 3
D Alle Inhalte einer JTextArea in einem JScrollPane löschen AWT, Swing, JavaFX & SWT 2
F Bilder zu ausführbarer Jar-Datei hinzufügen AWT, Swing, JavaFX & SWT 5
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
melaniemueller Wortliste in einer Datei ablegen AWT, Swing, JavaFX & SWT 12
princess_sara1997 .jar Datei führt den Code nicht richtig aus AWT, Swing, JavaFX & SWT 19
Yonnig Lokale HTML-Datei in Java GUI rendern AWT, Swing, JavaFX & SWT 4
N JavaFX Javafx intelij Projekt zu ausführbaren jar Datei Machen AWT, Swing, JavaFX & SWT 1
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
BabySuna Swing Komponenten auslagern auf separate Datei AWT, Swing, JavaFX & SWT 8
J Java Datei durch CMD mit Parameter ausführen AWT, Swing, JavaFX & SWT 1
B JavaFX JavaFX Anwendung deployen (entw als runnableJAR oder exe-Datei) AWT, Swing, JavaFX & SWT 15
M Eine Datei auf den Apache Server hochladen - über das Menü im JavaProgramm AWT, Swing, JavaFX & SWT 7
VPChief Gibt es eine möglichkeit Dateien aus der jar datei zu kopieren? AWT, Swing, JavaFX & SWT 46
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
MasterCaution Swing .jar Datei ausführen AWT, Swing, JavaFX & SWT 12
A Swing Datei lässt sich zwar speichern, aber nicht laden (Inhalt im JTextField anzeigen) AWT, Swing, JavaFX & SWT 18
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
G Verknüpfung einer pdf Datei AWT, Swing, JavaFX & SWT 2
N Ausführbare Datei aus JavaFX Projekt erstellen AWT, Swing, JavaFX & SWT 22
L Bilder werden in exportierter Datei nicht geladen AWT, Swing, JavaFX & SWT 6
L Csv-Datei einlesen AWT, Swing, JavaFX & SWT 34
J *.jar öffnet PDF-Datei nicht AWT, Swing, JavaFX & SWT 35
M JavaFX Altes Fenster (FXML Datei) löschen AWT, Swing, JavaFX & SWT 16
F Java FX Von der Fxml Datei zum Objekt AWT, Swing, JavaFX & SWT 8
A JavaFX Anwendung in Jar Datei AWT, Swing, JavaFX & SWT 8
F FXML Datei aus dem SceneBuilder in Eclipse aufrufen AWT, Swing, JavaFX & SWT 1
J Swing JavaProgramm für Verschlüssen für eine Datei AWT, Swing, JavaFX & SWT 19
T .jar-Datei lässt sich unflexibler ausführen als über die IDE AWT, Swing, JavaFX & SWT 11
Kanda Sorata Inhalt einer .txt Datei einlesen und in ein Label einfügen (JavaFX) AWT, Swing, JavaFX & SWT 2
H Musik wird nach dem erstellen der .jar Datei nicht mehr abgespielt AWT, Swing, JavaFX & SWT 1
H JavaFX aus der .fxml Datei einen Konstruktor bedienen AWT, Swing, JavaFX & SWT 3
P JavaFX - XCF Datei von Gimp kann nicht angezeigt werden AWT, Swing, JavaFX & SWT 3
M Wie binde ich eine JavaFX ProgressBar an eine Datei Übertragung? AWT, Swing, JavaFX & SWT 2
7 JavaFX Verwendung einer ResizableCanvas-Klasse in fxml-Datei AWT, Swing, JavaFX & SWT 3
C JavaFX Auf Nodes einer FXML-Datei in start Methode zugreifen AWT, Swing, JavaFX & SWT 5
F Pfad von eingelesener Datei AWT, Swing, JavaFX & SWT 10
Crazynet xls Datei in JTable AWT, Swing, JavaFX & SWT 3
D Objekte einer Oberfläche in eine Datei/Ordner speichern AWT, Swing, JavaFX & SWT 9
P Programm durch Dateiaufruf starten und Datei öffnen AWT, Swing, JavaFX & SWT 2
G .txt-Datei einlesen /formatieren in JTextfield ?? AWT, Swing, JavaFX & SWT 8
B ST Datei einlesen AWT, Swing, JavaFX & SWT 1
D JavaFX Jar Datei Signieren mit Java 8u45 AWT, Swing, JavaFX & SWT 2
M Datei mit Komponenten einbinden AWT, Swing, JavaFX & SWT 7
M Swing PDF Datei nach drucken nicht löschbar AWT, Swing, JavaFX & SWT 6
A Databinding in FXML-Datei AWT, Swing, JavaFX & SWT 1
H 2D-Grafik .EPS Datei in .PNG konvertieren AWT, Swing, JavaFX & SWT 1
G Datei öffnen Dialog modifizieren AWT, Swing, JavaFX & SWT 13
F Swing Java Swing Array in Datei und wieder raus AWT, Swing, JavaFX & SWT 7
L 2D-Grafik PNG Datei in JLabel Array Problem AWT, Swing, JavaFX & SWT 4
B JAVAFX und CSS Datei in Eclipse AWT, Swing, JavaFX & SWT 4
3 Swing JList-Inhalt als verschlüsselte Datei schreiben und lesen AWT, Swing, JavaFX & SWT 1
S Aus XML Datei FXML generieren AWT, Swing, JavaFX & SWT 4
V JavaFX - fxml-Datei laden (neben CSS) AWT, Swing, JavaFX & SWT 2
S Swing Verzeichnis/Datei-Pfad in JTextField schreiben AWT, Swing, JavaFX & SWT 2
A JFileChooser Datei speichern AWT, Swing, JavaFX & SWT 4
T Aus JAVA.Jar GUI eine Flash-Datei machen AWT, Swing, JavaFX & SWT 3
A Datei weiterverwenden mit JFileChooser AWT, Swing, JavaFX & SWT 6
A AWT TTF-Datei zu Font-Objekt finden? AWT, Swing, JavaFX & SWT 5
Iron Monkey Nach Drag & Drop die Datei auf Komponent darstellen AWT, Swing, JavaFX & SWT 2
J JFileChooser - Datei speichern AWT, Swing, JavaFX & SWT 7
M Datei in jar öffnen AWT, Swing, JavaFX & SWT 11
W Funktion aus einer Java Datei in eine andere einbauen AWT, Swing, JavaFX & SWT 25
P Neue Datei erstellen in JPanel AWT, Swing, JavaFX & SWT 5
N Speicherpfad für Datei auswählen AWT, Swing, JavaFX & SWT 2
A JTextArea - Zeichenbegrenzung nach .txt Datei import AWT, Swing, JavaFX & SWT 6
N Applet JButton soll html Datei aus einem Ordner öffnen AWT, Swing, JavaFX & SWT 2
E Swing jTextPane Text datei anzeigen AWT, Swing, JavaFX & SWT 7
M Datei Speichern unter Dialog - SWT AWT, Swing, JavaFX & SWT 3
T SWT:Datei speichern / öffnen AWT, Swing, JavaFX & SWT 6
X Applet Java Applet Datei Ausführung AWT, Swing, JavaFX & SWT 9
J Bild aus Datei in BufferedImage laden AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben