RandomAccessFile

SMoeller

Mitglied
Hallo,
ich weiß bei meinem Programm nicht weiter. Es soll 3 Strings in eine Datei schreiben und diese dann wieder ausgeben. Das ganze soll mit der Klasse RandomAccessFile funktionieren. Allerdings überschreibt mein Programm die vorherigen Einträge immer oder es liegt daran, dass ich zu Anfang der Methode immer ein neues RandomAccessFile-Objekt erstelle. Da ich am Montag eine Klausur über dieses Thema schreibe, wäre ich über schnelle Hilfe sehr dankbar.

Code:
/*
 * Created on 22.11.2006
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
import java.io.*;
/**
 * @author Sascha Möller
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class RAF 
{
    private final int MAXL = 40;
    private static RandomAccessFile file;
    
    public void schreiben(String s)
    {
        try
        {
            file = new RandomAccessFile("Textdatei.doc", "rw");
            long pos = file.getFilePointer();
            
            file.writeUTF(s);
            file.seek(pos + MAXL);
        }
        catch(FileNotFoundException fnfe)
        {
            fnfe.getMessage();
        }
        catch(IOException ioe)
        {
            ioe.getMessage();   
        }
    }
    
    public StringBuffer lesen(int index)
    {
         StringBuffer sb = new StringBuffer();
        try
        {
            file = new RandomAccessFile("Textdatei.doc", "r");
            
            file.seek(index * MAXL);
            
            for(int i=0; i<=MAXL; i++)
            {
                sb.append(file.readUTF());
            }
            
        }
        catch(FileNotFoundException fnfe)
        {
            fnfe.printStackTrace();  
        }
        catch(IOException ioe)
        {
            ioe.getMessage();   
        }
        return sb;
    }
    
    public static void main(String[] args)
    {
        RAF test = new RAF();
        
        test.schreiben("Hallo" + '\n');
        test.schreiben("grüß dich" + '\n');
        test.schreiben("wie gehts" + '\n');
        System.out.println(test.lesen(0));
        System.out.println(test.lesen(1));
        System.out.println(test.lesen(2));
    }
}
 
Hallo,

dein Fehler war, dass du den Text immer wieder überschrieben hast. So funktioniert es:
Code:
public void schreiben(String s)
    {
        try
        {
            file = new RandomAccessFile("Textdatei.doc", "rw");
            long pos = file.length();
            file.seek(pos);
            file.writeUTF(s);
            file.close();
            
        }
        catch(FileNotFoundException fnfe)
        {
            fnfe.getMessage();
        }
        catch(IOException ioe)
        {
            ioe.getMessage();   
        }
    }

MFG zEriX
 
Thx für die Antwort, muss man file.close() immer am Ende schreiben? Oder besser gefragt, passiert "hinter den Kulissen" irgendwas, das man vermeiden sollte?
Leider muss ich dich entäuschen, ich hab deinen Programmtext kopiert und durch meinen ersetzt und es ergibt immer noch das selbe Ergebnis wie vorher, d.h. der zuletzt geschriebene Eintrag wird ausgegeben, gefolgt von 2 leeren Zeilen.
Ich glaube aber, dass der Fehler beim Auslesen liegt, da alle Strings in der Datei stehen.
 
Zuletzt bearbeitet:
Mit der Methode Close() schließt man die Datei wieder, sonst könnte es passieren dass man auf die Datei nicht mehr zugreifen kann.
Code:
Oder besser gefragt, passiert "hinter den Kulissen" irgendwas, das man vermeiden sollte?
Wie meinst du das?
 
Dieser Code funktioniert.

Code:
/*
 * Created on 22.11.2006
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
import java.io.*;
/**
 * @author Sascha Möller
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class RAF 
{
    private final int MAXL = 40;
    private static RandomAccessFile file;
    
    public void schreiben(String s)
    {
        try
        {
            file = new RandomAccessFile("Textdatei.doc", "rw");
            long pos = file.length();
            file.seek(pos);
            file.writeUTF(s);
            file.close();
            
        }
        catch(FileNotFoundException fnfe)
        {
            fnfe.getMessage();
        }
        catch(IOException ioe)
        {
            ioe.getMessage();   
        }
    }
    
    public StringBuffer lesen(int index)
    {
         StringBuffer sb = new StringBuffer();
        try
        {
            file = new RandomAccessFile("Textdatei.doc", "r");
            
            file.seek(index * MAXL);
            
            for(int i=0; i<=MAXL; i++)
            {
                sb.append(file.readUTF());
            }
            file.close();
        }
        catch(FileNotFoundException fnfe)
        {
            fnfe.printStackTrace();  
        }
        catch(IOException ioe)
        {
            ioe.getMessage();   
        }
        return sb;
    }
    
    public static void main(String[] args)
    {
        RAF test = new RAF();
        
        test.schreiben("Hallo" + '\n');
        test.schreiben("grüß dich" + '\n');
        test.schreiben("wie gehts" + '\n');
        System.out.println(test.lesen(0));
        System.out.println(test.lesen(1));
        System.out.println(test.lesen(2));
    }
}

Und du musst natürlich deine alte Datei löschen.

MFG zEriX
 
Der Code hat bei mir erst funtkioniert, nachdem ich die Textdatei gelöscht habe und das Programm sie neu erstellt hat. Die Frage mit der close() Methode hast du auch beantwortet, thx.
 
Die Datei musste auch erst gelöscht werden. es wird ja immer nur was an die datei angefügt und mit dem Programm wurden nur die ersten 3 Datensätze ausgelesen. :-)


MFG zEriX
 
Zurück