Anzahl der Woerter der Woerterliste in der Datei speichern

G

gmx777

Gast
Hallo,

ich habe als Aufgabe bekommen einen Editor zu erstellen, welcher Woerterliste in einer Datei speichert und einliesst. Und es soll in dieser Datei auch die Anzahl der vorhandener Woerter gespeichert werden. Fuer den Zugriff auf die Datei soll die Klasse RandomAcessFile verwendet werden.
Den Editor welcher Wortliste in einer Datei speichert und einliesst, habe ich bereits geschrieben, aber wie man dort die Anzahl der aktuellen Woerter in dieser Woerterliste ermittelt und diese dort speichert gelingt mir nicht. Hier mein Quelltext:
Java:
import java.awt.BorderLayout;

import java.awt.Dimension;

import java.awt.FlowLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.IOException;

import java.io.RandomAccessFile;



import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;



public class Text1 extends JFrame {

	
	private static final long serialVersionUID = 6468516705291496250L;

	
	private JTextArea feld;

	
	private JButton einlesen, beenden, speichern;

	

	
	class MeinListener implements ActionListener {

		@Override

		public void actionPerformed(ActionEvent e) {

			
			if (e.getActionCommand().equals("lesen"))

			
				dateiLesen();

			
			if (e.getActionCommand().equals("speichern"))

			
				dateiSchreiben();


			if (e.getActionCommand().equals("ende"))

				System.exit(0);

		}

	}



	//der Konstruktor

	public Text1(String titel) {

		super(titel);

		JPanel tempPanel;

		feld = new JTextArea();

		einlesen = new JButton("Einlesen");

		einlesen.setActionCommand("lesen");

		speichern = new JButton("Speichern");

		speichern.setActionCommand("speichern");

		beenden = new JButton("Beenden");

		beenden.setActionCommand("ende");

		

		MeinListener listener = new MeinListener();

		einlesen.addActionListener(listener);

		speichern.addActionListener(listener);

		beenden.addActionListener(listener);

				

		setLayout(new BorderLayout());

		add(new JScrollPane(feld), BorderLayout.CENTER);

		tempPanel = new JPanel();

		tempPanel.setLayout(new FlowLayout(FlowLayout.LEFT));

		tempPanel.add(einlesen);

		tempPanel.add(speichern);

		tempPanel.add(beenden);

		add(tempPanel,BorderLayout.SOUTH);

		setMinimumSize(new Dimension(400,300));

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		setVisible(true);

	}



	//die Methode zum Lesen

	private void dateiLesen() {

		String text;

		try {

			RandomAccessFile datei = new RandomAccessFile("score.dat", "r");

			text=datei.readUTF();

			System.out.println(text);

			feld.setText(text);

			datei.close();

		}

		catch (IOException e ) {

			JOptionPane.showMessageDialog(this, "Problem aufgetreten");

	    }

	}



	private void dateiSchreiben() {

		try {

			RandomAccessFile datei = new RandomAccessFile("score.dat", "rw");

			datei.writeUTF(feld.getText());

			System.out.println(feld.getText());

			datei.close();

		}

		catch (IOException e ) {

			JOptionPane.showMessageDialog(this, "Problem aufgetreten");

	    }

	}

}

Kann mir jemand weiterhelfen ???
 
S

SlaterB

Gast
@Ironzwerg
auf solche sinnlosen Kommentare bitte wirklich verzichten, ein Thema noch ganz ohne Antworten ist viel prominenter zu sehen, in eigener Liste im Forum
java-forum.org - Suchergebnisse

der Code im ersten Posting ist aber auch sehr ungünstig, gmx777, fällt dir nicht auf dass da zwischen jeder Zeile eine Leerzeile ist?
selbst wenn dir das gefallen sollte oder irgendeine Umwandlung das versehentlich automatisch macht, so solltest du das fürs Forum korrigieren, wenn du hoffst dass sich das irgendjemand anschaut,
mit der Frage scheint der Code allerdings wenig zu tun zu haben,

zunächst lies den Dateiinhalt in einen String, ob mit oder ohne Zeilenumbruch, ohne ist vielleicht leichter, aber dann noch fraglich ob sich das auf Wörtergrenzen auswirkt,
ansonsten ist dein Stand folgender:
Java:
public class Test {
    public static void main(String[] args) {
        String st = "hallo wie geht's";
    }
}
du hast einen String und keine Ahnung wie man die Wörter darin zählt, soweit alles korrekt?

irgendwelche Versuche gemacht, etwa Anzahl Leerzeichen zählen?
 

Ironzwerg

Mitglied
Ja nee is klar.
Wäre auch nur interessant zu wissen.
Denn bei dem Kurs gabs nämlich auch so eine Aufgabe, nur in Verbindung mit dem Spiel Hangman.

Um dir mal zu helfen:
Schreibe einfach die Anzahl der Wörter an den Anfang der Datei.
Sobald du ein neues Wort speicherst erhöhst du diese Anzahl und schreibst sie wieder an den Anfang, sprich du überschreibst du Zahl einfach.
Und dann kannst du diese Zahl ganz einfach wieder auslesen.
 
G

gmx777

Gast
@Ironzwerg
auf solche sinnlosen Kommentare bitte wirklich verzichten, ein Thema noch ganz ohne Antworten ist viel prominenter zu sehen, in eigener Liste im Forum
java-forum.org - Suchergebnisse

der Code im ersten Posting ist aber auch sehr ungünstig, gmx777, fällt dir nicht auf dass da zwischen jeder Zeile eine Leerzeile ist?
selbst wenn dir das gefallen sollte oder irgendeine Umwandlung das versehentlich automatisch macht, so solltest du das fürs Forum korrigieren, wenn du hoffst dass sich das irgendjemand anschaut,
mit der Frage scheint der Code allerdings wenig zu tun zu haben,

zunächst lies den Dateiinhalt in einen String, ob mit oder ohne Zeilenumbruch, ohne ist vielleicht leichter, aber dann noch fraglich ob sich das auf Wörtergrenzen auswirkt,
ansonsten ist dein Stand folgender:
Java:
public class Test {
    public static void main(String[] args) {
        String st = "hallo wie geht's";
    }
}
du hast einen String und keine Ahnung wie man die Wörter darin zählt, soweit alles korrekt?

irgendwelche Versuche gemacht, etwa Anzahl Leerzeichen zählen?



Sorry fuer die leeren Zeilen im Quelltext, hier eine uberarbeitete Version:

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.RandomAccessFile;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Text1 extends JFrame {
	private static final long serialVersionUID = 6468516705291496250L;
	private JTextArea feld;
	private JButton einlesen, beenden, speichern;

	class MeinListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {	
			if (e.getActionCommand().equals("lesen"))
			dateiLesen();
			if (e.getActionCommand().equals("speichern"))
			dateiSchreiben();
			if (e.getActionCommand().equals("ende"))
			System.exit(0);
	}
}

	public Text1(String titel) {
		super(titel);
		JPanel tempPanel;
		feld = new JTextArea();
		einlesen = new JButton("Einlesen");
		einlesen.setActionCommand("lesen");
		speichern = new JButton("Speichern");
		speichern.setActionCommand("speichern");
		beenden = new JButton("Beenden");
		beenden.setActionCommand("ende");

		MeinListener listener = new MeinListener();
		einlesen.addActionListener(listener);
		speichern.addActionListener(listener);
		beenden.addActionListener(listener);
		setLayout(new BorderLayout());
		add(new JScrollPane(feld), BorderLayout.CENTER);
		tempPanel = new JPanel();
		tempPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
		tempPanel.add(einlesen);
		tempPanel.add(speichern);
		tempPanel.add(beenden);
		add(tempPanel,BorderLayout.SOUTH);
		setMinimumSize(new Dimension(400,300));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}

	//die Methode zum Lesen
	private void dateiLesen() {
		String text;
		try {
			RandomAccessFile datei = new RandomAccessFile("score.dat", "r");
			text=datei.readUTF();
			System.out.println(text);
			feld.setText(text);
			datei.close();
		}
		catch (IOException e ) {
			JOptionPane.showMessageDialog(this, "Problem aufgetreten");
	    }
	}

	private void dateiSchreiben() {
		try {
			RandomAccessFile datei = new RandomAccessFile("score.dat", "rw");
			datei.writeUTF(feld.getText());
			System.out.println(feld.getText());
			datei.close();
		}
		catch (IOException e ) {
			JOptionPane.showMessageDialog(this, "Problem aufgetreten");
	    }
	}
}


Wie meinst du das, "Datei in String einlesen?" etwa so:


Java:
private void dateiLesen() {
		String text;
		try {
			RandomAccessFile datei = new RandomAccessFile("score.dat", "r");
			text=datei.readUTF();
			System.out.println(text);
			feld.setText(text);
			datei.close();
		}
		catch (IOException e ) {
			JOptionPane.showMessageDialog(this, "Problem aufgetreten");
	    }
	}

Ich lese diese doch schon in String text ein??
 
S

SlaterB

Gast
sicher sicher, ich könnte jetzt sagen dass man das aus dem ersten Code mit Leerzeichen gar nicht lesen konnte ;)
aber ich habe auch gar nicht geschaut, ob du das schon hast oder nicht ist nicht die Frage,

es ist allein eine Feststellung:
1. Einlesen (hast du schon oder Fragen dazu stellen)
2. jetzt beginnt die Arbeit, vereinfacht am besten mit meinem Code neu anfangen, der Rest stört vorerst nur bei der Teilaufgabe 'Anzahl Zeichen in Text suchen'

nochmal die Frage: ist 2. genau die Frage? hast du dazu schon irgendwas gemacht?
wie wärs den String per Schleife Zeichen für Zeichen durchzugehen, jeder Wechsel von Leerzeichen auf was anderes zählt als ein Wort?
 
G

gmx777

Gast
Ja nee is klar.
Wäre auch nur interessant zu wissen.
Denn bei dem Kurs gabs nämlich auch so eine Aufgabe, nur in Verbindung mit dem Spiel Hangman.

Fuer mich ist es auch interessant zu wissen was ihr dort macht, vielleicht kannst es uns hier posten, oder ins PM schicken, vielleicht hilft es mir dann weiter ???

Um dir mal zu helfen:
Schreibe einfach die Anzahl der Wörter an den Anfang der Datei.

Wenn du mir erklaerst wie das geht, das ist naehmlich mein Problem.

Sobald du ein neues Wort speicherst erhöhst du diese Anzahl und schreibst sie wieder an den Anfang, sprich du überschreibst du Zahl einfach.

Und dies auch noch erklaerst wie das geht

Und dann kannst du diese Zahl ganz einfach wieder auslesen.

und dies anschliessend auch noch, dann hilft es mir weiter, aber so ist es nicht nachvollziehbar
 

Ironzwerg

Mitglied
Als erstes nimmt du eine neue Datei, sonst überschreibst du die Zeichen, die am Anfang der Datei standen, mit der Anzahl der Wörter.

Wie du etwas in die Datei schreibst, weißt du ja bereits. Sobald du etwas in die Datei schreiben willst, ist der Pointer beim ersten Zeichen in der Datei, da schreibst du mit
Code:
 datei.writeInt(anzahlWoerter);
die Anzahl der Wörter rein.
Anschließend springst du mit der Mehtode
Code:
datei.seek(datei.length());
an das Ende der Datei und schreibst dort dein Wort hin.

Zum Einlesen der Anzahl der Wörter setzt du in deiner Methode dateiLesen() in die Zeile 65 folgendes:

Code:
 int anzahlWoerter = datei.readInt();

Der Pointer springt automatisch weiter, wenn du etwas einliest, sprich du kannst dann einfach die Wörter auslesen, wie du es schon gemacht hast.
 
G

gmx777

Gast
Als erstes nimmt du eine neue Datei, sonst überschreibst du die Zeichen, die am Anfang der Datei standen, mit der Anzahl der Wörter.

Wie du etwas in die Datei schreibst, weißt du ja bereits. Sobald du etwas in die Datei schreiben willst, ist der Pointer beim ersten Zeichen in der Datei, da schreibst du mit
Code:
 datei.writeInt(anzahlWoerter);
die Anzahl der Wörter rein.
Anschließend springst du mit der Mehtode
Code:
datei.seek(datei.length());
an das Ende der Datei und schreibst dort dein Wort hin.

Zum Einlesen der Anzahl der Wörter setzt du in deiner Methode dateiLesen() in die Zeile 65 folgendes:

Code:
 int anzahlWoerter = datei.readInt();

Der Pointer springt automatisch weiter, wenn du etwas einliest, sprich du kannst dann einfach die Wörter auslesen, wie du es schon gemacht hast.

Was ich hier nicht verstehe, ist, woher deine Variable "anzahlWoerter" deren Werte bekommt??? Wie wird es festgestellt(ermittelt), wieviele Woerter in der Datei vorhanden sind??? Vielleicht kannst deine Aufgabe mal posten, wenn es mit der Erklaerung zu viel ist?
 
G

gmx777

Gast
sicher sicher, ich könnte jetzt sagen dass man das aus dem ersten Code mit Leerzeichen gar nicht lesen konnte ;)
aber ich habe auch gar nicht geschaut, ob du das schon hast oder nicht ist nicht die Frage,

es ist allein eine Feststellung:
1. Einlesen (hast du schon oder Fragen dazu stellen)
2. jetzt beginnt die Arbeit, vereinfacht am besten mit meinem Code neu anfangen, der Rest stört vorerst nur bei der Teilaufgabe 'Anzahl Zeichen in Text suchen'

nochmal die Frage: ist 2. genau die Frage? hast du dazu schon irgendwas gemacht?
wie wärs den String per Schleife Zeichen für Zeichen durchzugehen, jeder Wechsel von Leerzeichen auf was anderes zählt als ein Wort?

Ich habe schon probiert mit

Java:
datei.length()

dies liefert mir aber die Anzahl der Buchstaben und Freizeichen in der Datei, aber was anderes kenne ich auch nicht zur Loesung dieses Problems, ich meine speziele Methode dafuer
 
G

gmx777

Gast
nochmal die Frage: ist 2. genau die Frage? hast du dazu schon irgendwas gemacht?
wie wärs den String per Schleife Zeichen für Zeichen durchzugehen, jeder Wechsel von Leerzeichen auf was anderes zählt als ein Wort?

Wuerde deine Idee so umsetzen wollen, funktioniert aber nicht :(

Java:
int anzahl;
while(datei.getFilePointer() < datei.length()){
	if(datei.getFilePointer()==false)
		anzahl++;
}

oder so

Java:
int anzahl;
while(datei.getFilePointer() < datei.length()){
	if(datei.getFilePointer()==" ")
		anzahl++;
}

Damit will ich feststellen, wann ein Leerzeichen in der Datei erreicht wird, dann soll Anzahl um eins erhoeht werden
 

Ironzwerg

Mitglied
Hier ist die Methode zum Schreiben der Datei
Java:
	// Die Methode zum Speichern der Wörter aus der Datei
	private void datenSchreiben() {
		
		try {
			
			// Die Datei mit Schreib-Lesemodus erzeugen
			RandomAccessFile datei = new RandomAccessFile(dateiName, "rw");
									
			// Die Anzahl steht immer ganz am Anfang
			datei.writeInt(anzahlWoerter);
												
			// Den Pointer an das Ende der Datei, um dort das neue Wort zu speichern
			datei.seek(datei.length());
			
			// Zuerst das Trennzeichen in die Datei schreiben
			datei.writeChars("*");
			
			// Und das Wort in die Datei schreiben
			// Vorher werden aber alle Leerzeichen entfernt
			datei.writeUTF(wort);
			
			// Wieder schließen
			datei.close();
		}
		
		catch (IOException e) {
			
			JOptionPane.showMessageDialog(this, "Beim Schreiben der Wörterliste" +
										  " ist ein Problem aufgetreten");
		}
		
		// Wenn das Speichern der Datei erfolgreich war bzw. die Datei neu
		// angelegt wurde, wird das Icon zum Laden der Datei aktiviert.
		ladenAct.setEnabled(true);
		
		// Wenn die Wörterliste bereits geladen wurde, wird sie aktualisiert,
		// in dem sie nochmal geladen wird
		if (geladen) {
			
			datenLesen();
		}
		
		// Die Liste wurde aktualisiert
		// Gehört zu Aufgabe 2
		aktualisiert = true;
	}

Und hier die Methode zum Lesen der Datei
Java:
	// Die Methode zum Einlesen der Wörter aus der Datei
	private void datenLesen() {
		
		try {
			
			// Die Datei mit Nur-Lesemodus erzeugen
			RandomAccessFile datei = new RandomAccessFile(dateiName, "r");
			
			anzahlWoerter = datei.readInt();
			
			// Das Feld leeren
			feld.setText("");	
						
			// Die Daten aus der Datei lesen
			for (int index = 0; index < anzahlWoerter; index++) {
				
				// Zwei Bytes berspringen, da in ihnen das Trennzeichen ist
				datei.skipBytes(2);
				
				// Wenn das erste Wort aus der Datei gelesen wird
				if (index == 0) {
					
					// Dann wird keine Leerzeile eingefügt
					feld.append(datei.readUTF());
				}
				else {
					
					// Ansonsten wird eine Leerzeile mit eingefügt
					feld.append("\n" + datei.readUTF());
				}
			}
			
			// Wieder schließen
			datei.close();
		}
		
		catch (IOException e) {
			JOptionPane.showMessageDialog(this, "Beim Lesen der Wörterliste ist" +
										  " ein Problem aufgetreten");
		}
		
		// Das Label für die Anzahl der Wörter aktualisieren
		anzahlWoerterLabel.setText(Integer.toString(anzahlWoerter));
		
		geladen = true;
	}

Das sollte dir nun weiter helfen
 
G

gmx777

Gast
Das sollte dir nun weiter helfen

Hallo Ironzwerg,

vielen Dank fuer deine Methoden, leider funktionieren die bei mir nicht :( Es wird eine Ausnahme beim Oeffnen der Datei ausgeloest. Du hast auch noch in deinen Methoden in Zeilen 45

Java:
 geladen = true;

und


Java:
 aktualisiert = true;

stehen und dies ist irgendwo anders in Programm eingebunden und kann so nicht funktionieren.

Vielleicht zeigst doch noch mehr, oder komplett alles? Ist ja interessant zu wissen wie es gemacht hast, vielleicht hilft es mir auch.

Gruss:

gmx777
 

Ironzwerg

Mitglied
Da gehört nicht viel zu.
Wo die Variable geladen verwendet wird, siehst du in der Methode datenLesen() ab Zeile 38.
Und zwar hat das den Sinn, wenn die Liste bereits einmal geladen wurde und du dann ein Wort hinzufügst, wird die Liste erneut geladen, damit du dann die aktualisierte Liste zu sehen bekommst.
Das ist eine Bequemlichkeit für den Anwender, damit er nicht jedes Mal die Liste von Hand laden muss.

Die andere Variable kannst du ignorieren.
Diese wird für das HangMan Spiel verwendet und zwar, wenn man die Wörterliste aktualisiert hat und den Dialog dann schließt, startet das Spiel neu, damit man evtl. gleich das neue Wort zum Erraten bekommt.
Evtl. aus dem Grund, weil da ein Zufallsgenerator hinter hängt, der aus der Wortliste ein zufälliges Wort auswählt.
 
G

gmx777

Gast
Da gehört nicht viel zu.
Wo die Variable geladen verwendet wird, siehst du in der Methode datenLesen() ab Zeile 38.
Und zwar hat das den Sinn, wenn die Liste bereits einmal geladen wurde und du dann ein Wort hinzufügst, wird die Liste erneut geladen, damit du dann die aktualisierte Liste zu sehen bekommst.
Das ist eine Bequemlichkeit für den Anwender, damit er nicht jedes Mal die Liste von Hand laden muss.

Die andere Variable kannst du ignorieren.
Diese wird für das HangMan Spiel verwendet und zwar, wenn man die Wörterliste aktualisiert hat und den Dialog dann schließt, startet das Spiel neu, damit man evtl. gleich das neue Wort zum Erraten bekommt.
Evtl. aus dem Grund, weil da ein Zufallsgenerator hinter hängt, der aus der Wortliste ein zufälliges Wort auswählt.

Ich habe jetzt versucht boolean Variablen zu ignorieren etc. aber die Ausnahmebehandlung wird beim Lesen der Datei ausgeloest.

Was ich noch nicht verstehe ist dies in der Methode datenSchreiben(); :

Java:
datei.writeChars("*");

dort schreibst du * als Trennzeichen zwischen den Woerter ein, aber wie wird es beim Lesen dann beruecksichtigt?


Ich waere dir dankbar wenn du kompletten Quelltext posten wuerdest, denn so funktioniert es nicht bei mir, irgendwo ist halt der Hund begraben, aber wo? Dann ist dies auch erledigt.
 

Ironzwerg

Mitglied
Ich glaube, wenn ich dir den ganzen Code posten würde, würde ich von den Admin eins auf die Rübe bekommen.
Die Klasse ist zwar nicht groß, aber knapp 400 Zeilen sind es dennoch.
In der Methode datenLesen() gibt es eine Zeile, in der 2 Bytes übersprungen werden, darüber steht auch ein Kommentar.
Du solltest dir die Methoden mal genauer angucken und dir die Kommentare durchlesen.

Ich habe so das Gefühl, dass du einfach die Methoden nimmst und das Programm ausführen willst.
Die Exception bekommst du wahrscheinlich, weil du als Dateiname nicht den richtigen Pfad nimmst oder so.
Du solltest mal posten, was du da rein steckst und wie die Exception aussieht.
 

gmx777

Mitglied
Ich glaube, wenn ich dir den ganzen Code posten würde, würde ich von den Admin eins auf die Rübe bekommen.
Die Klasse ist zwar nicht groß, aber knapp 400 Zeilen sind es dennoch.

Nein nein, nein nein, bekommst nicht eins auf die Ruebe, Admin ist OK, ausserdem gibt's keine Einschraenkung fuer die Laenge eines Quelltextes. Wenn du trotzdem Angst um deine Ruebe hast, kannst es mir an die email, oder als PM schicken, das sieht Admin nicht ;)

In der Methode datenLesen() gibt es eine Zeile, in der 2 Bytes übersprungen werden, darüber steht auch ein Kommentar.
Du solltest dir die Methoden mal genauer angucken und dir die Kommentare durchlesen.

Ich habe die Kommentare mehrmals gelesen, aber die sind mir etwas zu kurz, es ist fuer einen aussenstehenden immer schwer sich in die Gedanken anderer Menschen zu versetzen, bei Themen und Aufgaben wie diese...

Ich habe so das Gefühl, dass du einfach die Methoden nimmst und das Programm ausführen willst.
Die Exception bekommst du wahrscheinlich, weil du als Dateiname nicht den richtigen Pfad nimmst oder so.
Du solltest mal posten, was du da rein steckst und wie die Exception aussieht.

Ich poste gleich meinen Quelltext:rtfm:
 

gmx777

Mitglied
Hier der Quelltext:

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.RandomAccessFile;

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

public class Woerterzaehlen extends JFrame {
	private static final long serialVersionUID = 6468516705291496250L;
	private JTextArea feld;
	private JButton einlesen, beenden, speichern;
	private int anzahlWoerter;
	
	class MeinListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			if (e.getActionCommand().equals("lesen"))
				datenLesen();
			if (e.getActionCommand().equals("speichern"))
				datenSchreiben();
			if (e.getActionCommand().equals("ende"))
				System.exit(0);
		}
	}

	//der Konstruktor
	public Woerterzaehlen(String titel) {
		super(titel);
		JPanel tempPanel;
		feld = new JTextArea();
		einlesen = new JButton("Einlesen");
		einlesen.setActionCommand("lesen");
		speichern = new JButton("Speichern");
		speichern.setActionCommand("speichern");
		beenden = new JButton("Beenden");
		beenden.setActionCommand("ende");
		
		MeinListener listener = new MeinListener();
		einlesen.addActionListener(listener);
		speichern.addActionListener(listener);
		beenden.addActionListener(listener);
				
		setLayout(new BorderLayout());
		add(new JScrollPane(feld), BorderLayout.CENTER);
		tempPanel = new JPanel();
		tempPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
		tempPanel.add(einlesen);
		tempPanel.add(speichern);
		tempPanel.add(beenden);
		add(tempPanel,BorderLayout.SOUTH);
		setMinimumSize(new Dimension(400,300));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}

	 private void datenLesen() {
	        try {
	            RandomAccessFile datei = new RandomAccessFile("score.dat", "r");  
	            anzahlWoerter = datei.readInt();
	            feld.setText("");   
	            for (int index = 0; index < anzahlWoerter; index++) {
	                datei.skipBytes(2);
	                if (index == 0) {
	                    feld.append(datei.readUTF());
	                }
	                else {
	                    feld.append("\n" + datei.readUTF());
	                }
	            }
	            datei.close();
	        } 
	        catch (IOException e) {
	            JOptionPane.showMessageDialog(this, "Beim Lesen der Wörterliste ist" +
	                                          " ein Problem aufgetreten");
	        }     
	    }
	  private void datenSchreiben() { 
	        try {
	            RandomAccessFile datei = new RandomAccessFile("score.dat", "rw");
	            datei.writeInt(anzahlWoerter);
	            datei.seek(datei.length());
	            datei.writeChars("*");
	            datei.writeUTF(feld.getText());
	            datei.close();
	        }  
	        catch (IOException e) {     
	            JOptionPane.showMessageDialog(this, "Beim Schreiben der Wörterliste" +
	                                          " ist ein Problem aufgetreten");
	        }	        
	  }
}


So loesst es keine Ausnahme aus, schreibt daten in die Datei und wenn ich dann den Inhalt der Datei mit Notepad oeffne, sieht es so aus:

Code:
   * Wort1 *

Aber der Editor kann dies nicht lesen.

Habe ich deine Methoden richtig umgesetzt?:bahnhof:
 

Ironzwerg

Mitglied
Das sieht doch ganz gut aus.
Warum hast du denn den Dateinamen fest verdrahtet.
Ich würde dir dafür eine Konstante empfehlen.
Veränderst du bei einer Methode den Dateinamen oder den Pfad, musst du diesen auch bei der anderen Methode ändern.
Sowas kann man leicht vergessen.
 

gmx777

Mitglied
Dann lass dir mal nicht alles aus der Nase ziehen und poste mal, woran es hakt

Seit letztem mal hat sich nichts geaendert, ich habe ja deine Methoden in mein Programm eingebaut und gefragt ob ich dies richtig umgesetzt habe und den Quelltext gepostet. Du hast gemeint, das es gut aussieht, aber Programm funktioniert nicht. Kannst es ja ausprobieren. Datei wird nicht eingelesen und es wird Anzahl der Woerter nicht angezeigt. Hier wieder der Quelltext:

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.RandomAccessFile;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
 
public class Woerterzaehlen extends JFrame {
    private static final long serialVersionUID = 6468516705291496250L;
    private JTextArea feld;
    private JButton einlesen, beenden, speichern;
    private int anzahlWoerter;
    
    class MeinListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getActionCommand().equals("lesen"))
                datenLesen();
            if (e.getActionCommand().equals("speichern"))
                datenSchreiben();
            if (e.getActionCommand().equals("ende"))
                System.exit(0);
        }
    }
 
    //der Konstruktor
    public Woerterzaehlen(String titel) {
        super(titel);
        JPanel tempPanel;
        feld = new JTextArea();
        einlesen = new JButton("Einlesen");
        einlesen.setActionCommand("lesen");
        speichern = new JButton("Speichern");
        speichern.setActionCommand("speichern");
        beenden = new JButton("Beenden");
        beenden.setActionCommand("ende");
        
        MeinListener listener = new MeinListener();
        einlesen.addActionListener(listener);
        speichern.addActionListener(listener);
        beenden.addActionListener(listener);
                
        setLayout(new BorderLayout());
        add(new JScrollPane(feld), BorderLayout.CENTER);
        tempPanel = new JPanel();
        tempPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
        tempPanel.add(einlesen);
        tempPanel.add(speichern);
        tempPanel.add(beenden);
        add(tempPanel,BorderLayout.SOUTH);
        setMinimumSize(new Dimension(400,300));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
 
     private void datenLesen() {
            try {
                RandomAccessFile datei = new RandomAccessFile("score.dat", "r");  
                anzahlWoerter = datei.readInt();
                feld.setText("");   
                for (int index = 0; index < anzahlWoerter; index++) {
                    datei.skipBytes(2);
                    if (index == 0) {
                        feld.append(datei.readUTF());
                    }
                    else {
                        feld.append("\n" + datei.readUTF());
                    }
                }
                datei.close();
            } 
            catch (IOException e) {
                JOptionPane.showMessageDialog(this, "Problem aufgetreten");
            }     
        }
      private void datenSchreiben() { 
            try {
                RandomAccessFile datei = new RandomAccessFile("score.dat", "rw");
                datei.writeInt(anzahlWoerter);
                datei.seek(datei.length());
                datei.writeChars("*");
                datei.writeUTF(feld.getText());
                datei.close();
            }  
            catch (IOException e) {     
                JOptionPane.showMessageDialog(this, "Problem aufgetreten");
            }           
      }
}

Die letzte Frage blieb quasie unbeantwortet, was soll ich da noch posten?:bahnhof:
 

Ironzwerg

Mitglied
Datei wird nicht eingelesen und es wird Anzahl der Woerter nicht angezeigt
Das ist doch eine schöne Fehlerbeschreibung, mehr wollte ich nicht.
Das Problem liegt daran, dass du beim Schreiben die Variable anzahlWoerter nicht hochzählst.

1) Ich würde dir vorschlagen, dass du beim Starten des Programm überprüfst, ob die Datei existiert.
Wenn sie nicht existiert, wird der Button Laden disabled.
Dadurch erparst du dem Benutzer eine Fehlermeldung, mit der der Benutzer eh nichts anfangen kann.

2) Dann würde ich das so machen, dass du die Textarea nicht editierbar machst.
Den Button speichern, würde ich Hinzufügen nennen und wennman drauf klickt, öffnet sich ein Eingabedialog, in dem man Wörter eingibt. Klickt man in diesem Dialog auf OK, wird das Wort in der Datei gespeichert und die Variable anzahlWoerter um 1 erhöht.

Dann klappt das mit dem Lesen auch.
So zum Testen kann du einfach in der Methode datenSchreiben() die Variable um 1 erhöhen.
Wenn du das öfter machst, 2 mal reicht schon, kommt es zu einem ungewünschten Nebeneffekt.
Daher auch die Idee mit dem Eingabedialog.

So einen Eingabedialog bekommst du mit JOptionPane.showInputDialog(...)

Wenn du dir die Methoden richtig angeschaut hättest, hättest du sehen müssen, dass die Wörter in der Methode datenLesen() in einer Schleife ausgelesen werden. Und für diese Schleife wird die Variable anzahlWoerter benötigt.
Da diese bei dir immer 0 ist, wird kein Wort ausgelesen.

Wenn du dich intensiver mit der Thematik beschäftigst, schaffst du das schon. Glaub mir.
 

gmx777

Mitglied
Das ist doch eine schöne Fehlerbeschreibung, mehr wollte ich nicht.
Das Problem liegt daran, dass du beim Schreiben die Variable anzahlWoerter nicht hochzählst.

Wenn du dir die Methoden richtig angeschaut hättest, hättest du sehen müssen, dass die Wörter in der Methode datenLesen() in einer Schleife ausgelesen werden. Und für diese Schleife wird die Variable anzahlWoerter benötigt.
Da diese bei dir immer 0 ist, wird kein Wort ausgelesen.


Java:
 private void dateiLesen() {
        String text;
        try {
            datei = new RandomAccessFile("score.dat", "r");
            text=datei.readUTF(); 
            System.out.println("datei.length()= "+datei.length());
            System.out.println("datei.getFilePointer()= "+datei.getFilePointer());
            
            //Durchsuchen der Datei
            while(datei.getFilePointer() < datei.length()) {
            	zahlDerWoerter++;
				System.out.println("zahlDerWoerter= "+zahlDerWoerter);
				System.out.println("datei.length()= "+datei.length());
            }
            System.out.println(text);
            feld.setText(text);
            datei.close();
        }
        catch (IOException e ) {
            JOptionPane.showMessageDialog(this, "Problem aufgetreten");
        }
    }

Warum klapt das Durchsuchen der Datei nicht in der while-Schleife? Der Pointer liegt am Ende der Datei, nicht am Anfang warum?:bahnhof:
 

Andi_CH

Top Contributor
Denk mal darüber nach ob du mit
Java:
text=datei.readUTF();
Vielleicht den Readpointer an das ende schiebst?

Ja, ist ein Schuss ins Blaue
 

Ironzwerg

Mitglied
Andi_CH hat recht.
Sobald du lesend auf die Datei zugreifst, verschiebst du den Pointer.
Das Gleiche gilt auch fürs schreiben.

Daher darfst du auch nur in der Schleife lesend auf die Datei zugreifen, sonst bekommst weiterhin Probleme.
Die Methode, die ich dir gegeben habe, funktioniert doch super, daher frage ich mich, warum du die Methode komplett verdreht hast?
Debugge meine Methode einfach mal, dann weißt was wann wo passiert.

Andere Frage:
Warum erhöhst du in der Methode die anzahl der Wörter in der Schleife immer um eins.
Das solltest du in der Methode datenSchreiben() machen.
Daher heißen die Methode ja datenSchreiben() ( Um die Daten in die Datei zu schreiben ) und datenLesen() ( um die Daten aus der Datei zu lesen ) ;)
 
Zuletzt bearbeitet:

gmx777

Mitglied
Denk mal darüber nach ob du mit
Java:
text=datei.readUTF();
Vielleicht den Readpointer an das ende schiebst?

Ja, ist ein Schuss ins Blaue

Schon moeglich, hilft mir aber nicht weiter, was ist die Loesung?

wenn ich erst die Schleife bringe und dann

Java:
text=datei.readUTF();


loesst es eine Endlosschleife aus
 

gmx777

Mitglied
Andi_CH hat recht.
Die Methode, die ich dir gegeben habe, funktioniert doch super, daher frage ich mich, warum du die Methode komplett verdreht hast?

Ich habe deine Methoden doch in mein Programm eingebaut und dir den Queltext gezeigt und gefragt ob dies so richtig umgesetzt habe und dich richtig verstanden habe, du hast gemeint: "ja"
Aber Programm lief nicht wie es sein sollte, deswegen.
 
Zuletzt bearbeitet:

Ironzwerg

Mitglied
Das stimmt ja auch.
Habe gerade noch mal nachgeguckt.
Das letzt Mal, als du Quelltext gepostet hast, war auch alles in Ordnung.
Die Methode hierß noch datenLesen() und mein Code war drin.

Jetzt heißt die Methode dateiLesen() und dein Code ist drin, der nicht funktioniert.
Wir haben dir gesagt, warum das so ist.

Ich habe auch schon gepostet, warum meine Methode bei dir anfangs nicht so funktioniert, wie gewünscht.
 

gmx777

Mitglied
Das stimmt ja auch.
Habe gerade noch mal nachgeguckt.
Das letzt Mal, als du Quelltext gepostet hast, war auch alles in Ordnung.
Die Methode hierß noch datenLesen() und mein Code war drin.

Ich glaube wir reden aneinander vorbei.....
Das erste mal hiess die Methode datenLesen() und dein code war drin und funktionierte nicht, ich kam mit den Ratschlaegen nicht weiter und habe es etwas anders versucht

Jetzt heißt die Methode dateiLesen() und dein Code ist drin, der nicht funktioniert.
Wir haben dir gesagt, warum das so ist.

Ich habe auch schon gepostet, warum meine Methode bei dir anfangs nicht so funktioniert, wie gewünscht.
Bei letzten code habt ihr gesagt warum es nicht funktioniert, aber keine Loesung angeboten, gezeigt wie es richtig geht:oops:
 

Ironzwerg

Mitglied
Wir sind ja auch nicht dazu da, dir Lösungen zu präsentieren, sondern um dir einen Denkanstoß zu geben.
Lösen sollst du die Aufgabe selber.
Und wir haben dir beschrieben, was du ändern musst und das schon mehrfach.
Wenn du mit unseren Beschreibungen nicht weiter kommst, postest du mit was du nicht weiter kommst, sprich was du noch nicht verstanden hast.
Und wir helfen dir dann weiter.
Wir wollen dich nicht dumm sterben lassen, aber von uns wirst du keine fertige Lösung bekommen.
Dass ich dir meine beiden Methoden gepostet habe, war eigentlich schon zu viel.

Das habe ich auch nur gemacht, weil ich die schon fertig hatte.
Den Rest musst du allerdings selber machen.

Es gibt aber auch einen schönen Thread dazu:
http://www.java-forum.org/hausaufga...eim-erschleichen-loesungen-fuer-aufgaben.html
 

Andi_CH

Top Contributor
Du bist ja schon beinahe ein bisschen eine Iron(ischer)zwerg :D aber recht hast du natürlich!

Und an den Problemhabenden:

Überleg dir doch einfach was du wann lesen und zählen willst und wann bzw warum deine Schleife abbrechen soll - am besten auf einem Blatt Papier und dann übersetzt du das in Java und tipppst es ab - glaub mir es wir laufen.

Vor dem Computer sitzen und Java anstarren kann einen so richtig blockieren.
 

gmx777

Mitglied
Wir sind ja auch nicht dazu da, dir Lösungen zu präsentieren, sondern um dir einen Denkanstoß zu geben.
Lösen sollst du die Aufgabe selber.

1. Die Aufgabe will ich ja selber loesen, ich habe doch nicht geschrieben; "hier ist die Aufgabenstellung Jungs, morgen bitte die Loesung vorlegen, bis morgen!:D"

2. Denkanstoss ist gut, doch die Problematik sollte man unterscheiden, das eine Problem kann in der Logik liegen, das andere in Wissen.
Wenn ich nicht weiss wie Java irgendetwas macht, dann ist jeder Denkanstoss zwecklos, mit Logik komme ich nicht weiter, ich muss wissen wie es in Java gemacht wird und warum, dann kann ich mit diesem Wissen und meiner Logik mich weiter bewegen. Aber wenn gewisse Dinge nicht ganz erklaert, oder Wissen vorenthalten wird, dann ist alles vergeblich.

Und wir haben dir beschrieben, was du ändern musst und das schon mehrfach.
Wenn du mit unseren Beschreibungen nicht weiter kommst, postest du mit was du nicht weiter kommst, sprich was du noch nicht verstanden hast.
Und wir helfen dir dann weiter.

Das habe ich doch geschrieben und gepostet letztes mal was ich nicht verstanden habe, nur ein Hinweis von euch dass es etwas falsch sei, und der Pointer sich am Ende der Datei befindet, ist nicht hilfreich, denn dies habe ich schon selber gemerkt, aber wie muss ich es anders richtig machen, ist die Frage.

Wir wollen dich nicht dumm sterben lassen, aber von uns wirst du keine fertige Lösung bekommen.
Dass ich dir meine beiden Methoden gepostet habe, war eigentlich schon zu viel.

Das habe ich auch nur gemacht, weil ich die schon fertig hatte.
Den Rest musst du allerdings selber machen.

Es gibt aber auch einen schönen Thread dazu:
http://www.java-forum.org/hausaufga...eim-erschleichen-loesungen-fuer-aufgaben.html

Also dumm bin ich gar nicht, fuer die meisten meiner Hausaufgaben habe ich die Note 1.0 bekommen und diese habe ich alleine geloesst und nutze das erste mal hier Hilfe im Bereich "Hausaufgaben", weil mir die Puzzelteile an Wissen fehlen.

Und dein Thread liegt daneben.

Ich mache ein extrem primitives Beispiel, nur um die Sache zu verdeutlichen.

Ein Lehrer erklaert dem Schueller wie man Variablen in Java vereinbart. Stehlt eine int-, double-, long-, short- und char-Variable vor. Als Hausaufgabe gibt er dem Schueler eine Aufgabe, Variable zu schreiben mit der man Zeichenkette speichern kann. Der Schueler kommt nach Hause zerbricht sich den Kopf wie er jetzt mit dem erworbenen Wissen eine Zeichenkette in einer Variable speichern kann. Das Ergebnis ist negativ. Der Schueler sucht Hilfe im Internet, vergeblich(bei diesem Beispiel wird er sicherlich etwas finden :) , aber dies ist nur ein Beispiel).
Der Schueler sucht Hilfe im Forum, und legt dort seine Versuche vor. Nette Menschen teilen ihm mit, dass er es falsch mache, er muss die Variable anders vereinbaren, dann wird es klappen. Der Schueler fragt wie er es richtig machen muss, wie lautet die Loesung. Als Antowrt bekommt er dann, das die Loesung er schon selber finden muss, man sei nicht dafuer da, aber man ist bereit ihm zu helfen er soll nur darauf hinweisen wo das Problem liege und zugleich bekommt er einen schoenen Link http://www.java-forum.org/hausaufgaben/63088-5-1-2-phasen-beim-erschleichen-loesungen-fuer-aufgaben.html
Man stuft ihn also ab.
Wie soll der Schueler jetzt draufkommen, dass es noch in Java eine Variable vom Typ String gibts und er diese verwenden muss? Der Lehrer hat es ihm nicht mitgeteilt und im Forum hielt man es fuer ein grosses Geheimnis und hat ihn als einen Dummkopf eingestufft und Erschleicher etc.

Hoffe dass ich nun richtig verstanden werde. ???:L
 

Ironzwerg

Mitglied
Alles gut und schön.
Dann sag uns doch mal, wie wir dir am Besten helfen können.
Ich habe mir den Thread noch mal alle genau durchgelesen um evtl. Erklärungsfehler zu finden.
Ergebnislos.

Als du meine Methoden eingebaut hast und es bei dir nicht funktioniert hat, habe ich dir folgendes geschrieben.
1) Ich würde dir vorschlagen, dass du beim Starten des Programm überprüfst, ob die Datei existiert.
Wenn sie nicht existiert, wird der Button Laden disabled.
Dadurch erparst du dem Benutzer eine Fehlermeldung, mit der der Benutzer eh nichts anfangen kann.

2) Dann würde ich das so machen, dass du die Textarea nicht editierbar machst.
Den Button speichern, würde ich Hinzufügen nennen und wennman drauf klickt, öffnet sich ein Eingabedialog, in dem man Wörter eingibt. Klickt man in diesem Dialog auf OK, wird das Wort in der Datei gespeichert und die Variable anzahlWoerter um 1 erhöht.

Dann klappt das mit dem Lesen auch.
So zum Testen kann du einfach in der Methode datenSchreiben() die Variable um 1 erhöhen.
Wenn du das öfter machst, 2 mal reicht schon, kommt es zu einem ungewünschten Nebeneffekt.
Daher auch die Idee mit dem Eingabedialog.

So einen Eingabedialog bekommst du mit JOptionPane.showInputDialog(...)

Wenn du dir die Methoden richtig angeschaut hättest, hättest du sehen müssen, dass die Wörter in der Methode datenLesen() in einer Schleife ausgelesen werden. Und für diese Schleife wird die Variable anzahlWoerter benötigt.
Da diese bei dir immer 0 ist, wird kein Wort ausgelesen.

In deinem nächsten Post hast du dann deine Mehtode dateiLesen() gezeigt.
Bist aber nicht darauf eingegangen, was ich dir vorher geschrieben habe.

Vergleich mal deine Methode mit meiner und guck dir evtl. im Debugger an, wo der Unterschied der Methoden liegt.
 

gmx777

Mitglied
Alles gut und schön.
Dann sag uns doch mal, wie wir dir am Besten helfen können.
Ich habe mir den Thread noch mal alle genau durchgelesen um evtl. Erklärungsfehler zu finden.
Ergebnislos.

Als du meine Methoden eingebaut hast und es bei dir nicht funktioniert hat, habe ich dir folgendes geschrieben.


In deinem nächsten Post hast du dann deine Mehtode dateiLesen() gezeigt.
Bist aber nicht darauf eingegangen, was ich dir vorher geschrieben habe.

Vergleich mal deine Methode mit meiner und guck dir evtl. im Debugger an, wo der Unterschied der Methoden liegt.

Das Problem mit deinem Vorschlag den du hier zitierst waere nicht geloest und es weicht von der Aufgabe ab.

1. ueberpruefen ob die Datei exestiert oder nicht ist erstmal unwichtig, sie ist da ich sehe sie, dies kann ich spaeter machen, wenn das Hauptproblem geloest ist um die Sache etwas zu verschoenern. Problem lag und liegt mit deinen eingebauten Methoden in meinem Programm beim Einlesen und Zaehlen.

2.Textarea nicht editierbar machen und ueber Eingabedialog einlesen weicht von der Aufgabe ab, ich soll es ueber Editor machen, deswegen!

Deswegen habe ich versucht noch mal aus eigener Kraft das etwas anders zu machen, Schritt fuer Schritt und habe meinen Quelltext ohne deine Methoden gepostet, weil diese konnten Datei nicht lesen. Ob ich Methode dateiLesen() oder datenLesen()
nenne ist doch egal, oder?

Wie ihr mir am Besten helfen koennt?

Als erstes habe ich mir vorgenommen die Datei in einem Editor komplett lesen zu koennen, ich moechte sehen wie die Daten dort reingeschrieben werden, bis jetzt ist es wie blinde Kuh spielen, man kann die Datei score.dat oeffnen mit Notepad z.B. , aber dann sieht man z.B. nur Buchstaben und Sonderzeichen, keine Zahlen die mit writeInt() eingetragen werden. Das gleiche ist mit Notepad++ etc. Kennst du ein Programm das dies alles in einem Rutsch anzeigen kann ohne Sonderzeichen?

Als zweites waere eine direkte Antwort viel besser, wenn ihr sagt etwas ist falsch, dann zeigt doch wie es richtig sein muss. Wie kann ich den Pointer in der Datei auf Anfang setzen, wenn ich diese in der Schleife durchsuchen will? Den Pointer an das Ende der Datei verschieben geht mit datei.length(), das weiss ich, aber wie an den Anfang? Oder wie ermittle ich die aktuelle Position des Pointer? Dann sehen wir weiter, was ich damit erreichen kann.
 

Ironzwerg

Mitglied
In der Methode datenSchreiben() befindet sich die Zeile
Java:
datei.seek(datei.length());
Damit setzt man den Pointer ans Ende der Datei.
Sprich du musst die Methode seek() verwenden.
In der JavaDoc findest in der Klasse RandonAccessFile eigentlich alle Informationen die du brauchst.

Wenn wir dir zeigen wie es geht, dann würden wir dir die Lösung posten.
Wenn du die Datei nicht in einem bestimmten Schema schreibst, kannst du sie auch nicht richtig lesen.
Denn beim Lesen wird am Anfang zum Beispiel die Anzahl der Wörter berücksichtigt, dann noch das Trennzeichen "*" und dann das Wort.

Aber wie schon gesagt, guck dir meine Methoden an.
Da findest du alles was du brauchst.

Das die Datei so komisch aussieht ist völlig in Ordnung
 

gmx777

Mitglied
In der Methode datenSchreiben() befindet sich die Zeile
Java:
datei.seek(datei.length());
Damit setzt man den Pointer ans Ende der Datei.
Sprich du musst die Methode seek() verwenden.
In der JavaDoc findest in der Klasse RandonAccessFile eigentlich alle Informationen die du brauchst.

Ich wollte wissen wie man den Pointer an Anfang der Datei setzt nicht an das Ende


Wenn wir dir zeigen wie es geht, dann würden wir dir die Lösung posten.

Und wo liegt das Problem? Wenn mich jemand hier im Forum fragt wie man in Java eine Variable fuer Zeichenkette vereinbart, dann poste ich ihm das hier:

Java:
String text="Zeichenkette";

Dann weiss er wie das in Java gemacht wird und die Sache ist erledigt.
Wenn er mich dann fragt wie er eine zweite Variable davon vereinbaren muss, dann sage ich ihm, dass er das genauso machen muss wie bei der ersten Variable.
 

Ironzwerg

Mitglied
Das habe ich dir doch geschrieben, wie man den Pointer an den Anfang bekommt.
Benutze die Methode seek() der Klasse RandomAccessFile.

In der JavaDoc findest du weitere Informationen.
Mit der solltest du dich unbedingt beschäftigen.

Einmal mache ich es noch:
Du gibst der Methode seek() ein Long mit. Um den Pointer an das Ende zu bekommen gibst du der Methode datei.length mit.
Also musst du einfach nur eine 0 mit geben und du bist am Anfang.
Mit ein wenig Überlegung kann man da auch selbst drauf kommen.

Wie gesagt, der Debugger ist dein Freund.

Ob ich jemanden schreibe wie man eine Variable initialisiert oder jemanden ein komplettes Programm schicke, ist ein kleiner Unterschied.
Da du nur mit der TextArea arbeiten wilst bzw. darfst sind noch ein paar Umbauarbeiten in den Methoden nötig.
Ich glaube nicht, dass irgendjemand für dich sich die Lösung überlegt und implementiert.

Daher beschreiben wir nur, was du als nächstes zu tun hast.
Umsetzen musst du es alleine.
 

gmx777

Mitglied
Hallo,

also jetzt schreibt mein Programm Woerter in die Datei und speichert dort auch die Anzahl der Woerter, die in der Datei vorhanden sind. Das ganze sieht dann in der Datei etwa so aus wenn man es in Notepad oeffnet:

Code:
    
erstesWort zweitesWort drittesWort

Das Einlesen dieser Daten im Editor funktioniert jedoch nicht wie gewuenscht.
Das Einlesen von Anzahl der gespeicherten Woerter mit datei.readInt() funktioniert gut, jedoch nicht
das Einlesen von Woertern in den Editor mit datei.readUTF() jedoch nicht. Das erste Wort mit einem Sonderzeichen wird ausgegeben und dann stopt das Programm. Egal ob ich es mit Schleife einlese, oder ohne.

Hier noch mal die aktuelle Methode fuer das Einlesen:

Java:
private void dateiLesen() {
        String text;
        try {   	
        datei = new RandomAccessFile("score.dat", "r");
        gespeicherteZahlDerWoerter=datei.readInt();
        System.out.println("datei.readInt()= "+gespeicherteZahlDerWoerter);
        datei.close();
        }
        catch (IOException e ) {
            JOptionPane.showMessageDialog(this, "Problem aufgetreten");
        }
        try {
           datei = new RandomAccessFile("score.dat", "r"); 
            System.out.println("datei.getFilePointer()= "+datei.getFilePointer());
            text=datei.readUTF();
            System.out.println(text);
            System.out.println("datei.getFilePointer()= "+datei.getFilePointer());
            feld.setText(text);
            datei.close();     
        }    
        catch (IOException e ) {
            JOptionPane.showMessageDialog(this, "Problem aufgetreten");
        }
    }

Warum? Was kann das Problem sein?:bahnhof:
 

gmx777

Mitglied
Die Fehlermeldung:

Code:
java.io.EOFException
	at java.io.RandomAccessFile.readFully(Unknown Source)
	at java.io.DataInputStream.readUTF(Unknown Source)
	at java.io.RandomAccessFile.readUTF(Unknown Source)
	at Woerterliste.dateiLesen(Woerterliste.java:93)
	at Woerterliste.access$0(Woerterliste.java:65)
	at Woerterliste$MeinListener.actionPerformed(Woerterliste.java:28)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Ich vermute das es daran liegt, dass in der Datei auch Werte vom Typ int gespeichert sind und wenn mit readUTF() zugegriffen wird, dann kann die Methode es nicht lesen, aber warum geht es umgekehrt, wenn readInt() aus der Datei liesst, obwohl es dort auch String-Werte gibt's, erscheinen keine Probleme. :bahnhof:
 

Ironzwerg

Mitglied
Beim Einlesen öffnest du einemal die Datei, um die Anzahl der Wörter auszulesen, dann schließt du sie wieder.
Im nächsten Schritt öffnest du die Datei wieder und willst ein Wort auslesen.
Da der Pointer dann wieder am Anfang der Datei, funktioniert das nicht, weil du mit readUTF einen int-Wert auslesen willst.

Mach alles in einem try-catch-Block.
Öffne die Datei, lies die Anzahl der Wörter aus und dann kannst du die Wörter an sich auslesen.

Wie schreibst du die Datei?
Ich sehe nicht, dass du 2 Byte für das Trennzeichen überspringst.
Du solltest ein Trennzeichen verwenden, um die Wörter einzeln auslesen zu können, sonst bekommst du alle Wörter direkt hintereinander ausgegeben.
 

Neue Themen


Oben