Dateizeiger

Status
Nicht offen für weitere Antworten.
T

Tomxx

Gast
Hallo!

Ich benötige mal eure Hilfe. Und zwar habe ich eine z.B. 30Byte große Datei angelegt und möchte nun etwas in diese Datei schreiben. Immer hintereinander. Das Problem ist jetzt, dass ich ja den Dateizeiger immer an die letzte Position in der Datei bewegen muss.

Da die Datei ja von der Größe her statisch ist, muss ich ja auch zwischen wirklich geschriebenen Zeichen und Leerzeichen unterscheiden um das Ende des Textes zu finden.

Wie mache ich das am besten??

Danke
Tom
 

Kola

Aktives Mitglied
Kannst du vielleicht dein Problem beschreiben, und nicht, wie du dir die Lösung vorstellst? Dann kann man besser mit der Lösung ansetzen!

z.B. Problem: Logging-Events in einer Datei speichern, Datei soll nicht größer als 30KB werden?
-> Da gibt es bei Log4J schon fertige Lösungen
 
T

Tomxx

Gast
Hallo!


Eigentlich is das nix weiter. Ich probieren gerade noch ein wenig mit Java rum. Ich möchte halt nur von der Standardeingabe ein paar Zeichen einlesen, diese in einen Datei abspeichern und fertig. Das geht auch bis hier her.

Leider überschreibt er die ersten Zeichen immer wieder. Soll aber eigentlich immer nur an die alten Bytes in der Datei anhängen und soll z.B. eine festgelegt Größe überschreiten.


Jo...das zu meiner kleinen Aufgabe

mfg
Tom
 

Murray

Top Contributor
Was das Anhägen angeht: beim FileOutputStream kann man im Konstruktor angeben, ob angehängt oder überschrieben werden soll.

Das mit der festgelegten Größe habe ich nicht verstanden ???:L
 

Noar

Bekanntes Mitglied
Hi,

wie schreibst du denn momentan in deine datei?

Bist du sicher, das du die datei nicht jedes mal neu erstellst (und somit überschreibst)?
Soweit ich dich verstanden habe, möchtest du die Daten ja immer am Ende der alten Datei anfügen.
Das ist eigentlich problemlos möglich.

Wenn du die Klasse "FileWriter" verwendest, verwende den Konstruktor
Code:
FileWriter(File file, boolean append)

Wenn der boolean Ausdruck dabei wahr (true) ist, werden die Daten einfach ans Ende der Datei angehängt.

Was die Größe angeht: Du wolltest sicher, das die Datei eine bestimmte Größe nicht überschreiten darf, oder?
Dann wirst du die Bedingung wohl vor jedem Schreibzugriff testen müssen.

Schöne Grüße,
Noar
 
G

Gast

Gast
auf welche art schreibst du denn zurzeit in die Datei? mit einem Stream?
 
T

Tomxx

Gast
So...hier mal das ganze Programm bis jetzt.

Code:
import java.io.*;
import java.util.*;

public class Random {

  public static void main (String[] args) throws IOException{
    int i, n;
	   
    {
        try {
          int zahl1;
          long len, pos = 0;

          RandomAccessFile datei = new RandomAccessFile("random.txt", "rw");                
          BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );
          
          datei.setLength(30); // Dateigröße festlegen
          len = datei.length();
        
          System.out.println("Aktuelle Größe der Datei: " + len +"Bytes");
                 
                 
          //System.out.println("tatsächlich beschrieben: " + pos +"Bytes");
          
          
          System.out.print("Größe und Füllzeichen eingeben: ");
          String s = in.readLine();
          
          StringTokenizer st = new StringTokenizer(s);
          String str1 = st.nextToken();
          String str2 = st.nextToken();
   
          zahl1 = Integer.parseInt(str1);
          String s2 = str2.substring( 0, 1 );             
 
          System.out.println( "Der eingelesene Text lautet: " + s);
          
          for (n=1; n<=zahl1; n++)
          {
        	  for (i=0; i < s2.length(); i++)
                {
        		  datei.writeBytes(str2);
        	    }
          }
          
          datei.close();
          System.out.println("Datei ist geschrieben!");
         
          
        } catch( IOException ex ) {
          System.out.println( ex.getMessage() );
        } 
    } 
    
  }
}


Das Ganze soll mal zum Schluss zu einem Filesystem führen. So richtig mit einer FAT. Aber dazu muss ich erstma schauen, wie ich überhaupt richtig in eine Datei schreibe kann und wie ich den Dateizeiger setzten und bewegen kann und wie ich jeweils die Anfangsadresse und Endadresse der geschriebenen Daten auslesen und speicher kann.

Jo...das ist, auf was dat alles rausläuft. Und so einen Plan von Java habe ich auch noch nicht. Diese ganzen Klassen sind echt verwirrend :-(

Danke euch
Tom
 

Murray

Top Contributor
Wenn Du in einem RandomAccessFile an eine bestimmte Stell schreiben willst, brauchst Du dazu die Methode seek:
Code:
datei.seek( datei.length()); //--- set file-pointer to the end of the file
 
G

Guest

Gast
Wozu soll das überhaupt gut sein?

Da musste leider meinen Prof fragen.


Also das soll jetzt kein richtiges Filesystem werden, so das es auf einer HDD genutzt werden kann. Das Ganze funzt so....ich habe z.B. eine 32MB große Datei. Die Datei stellt sozusagen einen virtuelle HDD dar. Es findet nicht wirklich ein Hardwarezugriff statt. Das Ganze wird sicherlich über einen verkettete Liste führen. In Datei wird dann mit Füllzeichen beschrieben. Diese Füllzeichen sollen dann einen Namen bekommen und mit der Start und Endadresse in der FAT abgelegt werden. Das ist im Prinzip der grobe Hintergrund.

Sowas ist in Java völlig unmöglich...
Ist möglich...Habe einige meiner Komonitonen schon gemacht. :lol:

Das mit dem seek habe ich zwar auch schon versucht..aber werds nochma probieren..

gruss
Tom
 

Wildcard

Top Contributor
Das geht natürlich. Wenn du von einem FAT Dateisystem redest erwarte ich eben was anderes als eine Containerdatei-Hausaufgabe :roll:
Also mach weiter und lass dich nicht stören...
 

Kola

Aktives Mitglied
Du kannst natürlich auch dein Dateisystem mit Objekten aufbauen, und erst beim Wegschreiben kloppst du das platt.
Du kannst auch den Inhalt der Datei in ein byte-Array oder Character-Array, oder in einen großen String einlesen, transformieren, und wegschreiben.
Das kommt mir auf jeden Fall einfacher vor, als der wahlfreie Zugriff auf eine Datei, und funktioniert auch übers Netzwerk!!! Das gibt PLUSPUNKTE!!!
 
T

Tomxx

Gast
Hallo Kola!

Das musste mir jetzt nochma genauer erklären mit den Byte-Arrays. Hier noch ein paar mehr Informationen dazu. Also die Datei soll im Prinzip wie ein richtiges Dateisystem aufgebaut sein. So mit Sektoren, Clustern u. einer FAT. Die Sektoren haben eine festgelegte Größe von 512Byte. D.h. wohl, dass ich jetzt ein Byte-Array von 512Byte anlegen muss? Sind meine Füllzeichen jetzt mehr als 512Byte, dann füll ich das Array und schreibe erstma die ersten 512 Byte in die Datei, bevor die restlichen folgen? Die Cluster sollen eine Größe von 1, 2, 4, 8 oder 16KByte haben. Diese Angabe soll ich beim quasi "Formatieren" der Datei angeben. Keine Ahnung wie das gemeint ist. Also das Formatieren ist klar. Einfach z.B. Nullen in die Datei schreiben. Aber wie das mit den Clustern gemeint ist ???:L ist mir bis jetzt noch unklar

Vielleicht kannst du mir dazu etwas sagen. Wäre super nett von dir !!

Danke
Tom
 
G

Gast

Gast
Hi,
du musst aufpassen, dass du hier nicht nach einer Lösung deiner Aufgaben fragst. Das ist weder gerne in Foren gesehen, noch bringt es dich im Studium weiter (die Klausur kommt schließlich irgendwann).
Wie ein Dateisystem aufgebaut ist, das ist dir ja sicherlich klar. Mehrere Sektoren werden also einfach in Clustern zusammengefasst. Der Vorteil liegt ganz einfach darin, dass es immer gewisse Grenzen gibt. Typisch sind hier häufig die 32 Bit für Adressen. Mit VZ hast du also max. 2,1 Mrd. Adressen, die du verwalten kannst. Hast du also (2^{31} - 1) * 512 Byte kannst du ebend nur diese Adressieren (deutlicher wird es, wenn du nur 16 Bit zum Adressieren hättest!). Damit dein OS hier deutlich mehr Platz zum speichern hat (die meisten Dateien sind >> 512 Byte), fässt du einfach mehrere Sektoren zu einem Cluster zusammen. Schreibst du in ein Cluster werden einfach diese Sektroen verwendet.
Das ganze kannst du also sehr leicht als Klasse modellieren. Ein Sektor kannst du z.B. als ein ByteArray betrachten, ein Cluster legt dann einfach (je nach Formatierun) x Sektoren an. Der Eigentliche Schreibzugriff findet dann auf Ebene der Cluster statt. Dieses muss die Daten einfach auf die Sektoren verteilen und mit 0en auffüllen.
 
T

Tomxx

Gast
Hallo...ich bins wieder..


Bin gerade dabei, die Konsole des Programms zu schreiben. Bin dabei aber auf ein Problem gestoßen mit dem ich nich ganz weis, wie ich es besser ober gar ganz anders machen kann.

Hier mal der Auszug aus dem Code

Code:
while(true) {
			try {                
				BufferedReader in = new BufferedReader( new InputStreamReader( System.in ));

				System.out.print("<Prompt/> ");
				eing = in.readLine();
				
				StringTokenizer st = new StringTokenizer(eing);
		        String str1 = st.nextToken();
		        String str2 = st.nextToken();
		        String str3 = st.nextToken();
		        String str4 = st.nextToken();
				
		        char asw = str1.charAt(0);
		        switch (asw) {
		        	case 'F': System.out.println("Format"); break;
		        	case 'I': System.out.println("Info"); break;
		        	case 'C': groesse = Integer.parseInt(str2);  
		        			  anlegen (groesse, str3);  break;
		        }
			}
		catch(Exception e) { 
			System.out.println(e);
			System.out.println("Eingabe erwartet");
			}

Das Problem is der StringTokenizer. Er wirft eine Exception, sobalb z.B. "str4" ungenutzt, also leer bleibt.
z.B. beim reinschreiben in die Datei gebe ich folgenes an. > C 1000 d < (C für Create, 1000 = Anzahl der Bytes und d = Füllzeichen). Ihr seht, dass jetzt str4 leer bei der Eingabe bleibt.

Was kann man dagegen tun??

Danke
Tom
 

Murray

Top Contributor
Eine Möglichkeit:
Code:
String str1 = (st.hasMoreTokens() ? st.nextToken() : null);
String str2 = (st.hasMoreTokens() ? st.nextToken() : null);
String str3 = (st.hasMoreTokens() ? st.nextToken() : null);
String str4 = (st.hasMoreTokens() ? st.nextToken() : null);

Flexibler wäre es wohl, statt der explizit deklarierten Strings ein String-Array zu verwenden.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben