Hallo
Lese zwar öfter ein paar beiträge in dem Forum und hab mich heute dazu entschlossen mich zu registrieren weil ich seit Tagen ein problem bezüglich RandomAccessFile habe. (Ich lerne für meine prüfung ob ich in die 3te klasse aufsteigen darf).
Die aufgabenstellung ist das wir Datensätze bestehend aus einigen variablen mit RAF abspeichern sollen.
Wir haben es so gelernt das wir zuerst den platzverbrauch der variablen berechnen:
Das sieht bei mir so aus :
Es sind 2 int variablen vorhanden für die benötige ich 8 Bytes.
Und es sind 3 String variablen mit jeweils 20 zeichen vorhanden das macht nochmal 120 Bytes ( +10 sollten umlaute enthalten sein)
Das ergibt 138 bytes, bin mir nicht sicher ob das so stimmt^^
Dadurch erleichtern wir uns die arbeit in den nächsten Methoden um einiges
zb.: zeigerpositionieren mithilfe von "(satznummer-1) * datensatzlänge"
Hab das ganze dann ausprogrammiert und nach ewigen fehlermeldungen das etwas mit raf.readUTF(); nicht funktioniert habe ich versucht mir die länge der Datei zurückgeben zu lassen.
Als rückgabe erhielt ich 74 Bytes. Hab dann dementsprechend alles geändert und auf einmal funktionierts.
Die nun alles Entscheidende frage ist warum handelt es sich um 74 Bytes (pro datensatz) ?
Wenn ich bei meiner prüfung gefragt werde warum 74 gibt das einen rießen punkteabzug.
---------------------------------
Wieso sind in meiner txt Datei wenn ich diese per hand öffne seltsame zeichen und striche vorhanden ?
Wenn ich sie mit RAF auslese bekomme ich trotzdem eine einwandfrei lesbare antwort
---------------------------------
Wie muss ich es angehen wenn ich zeilenumbrüche in meiner Datei anzeigen will ? (\n)
Quellcode folgt
Meine Main methode
Würde mich sehr freuen wenn sich jemand finden würde der mir hilft
Lese zwar öfter ein paar beiträge in dem Forum und hab mich heute dazu entschlossen mich zu registrieren weil ich seit Tagen ein problem bezüglich RandomAccessFile habe. (Ich lerne für meine prüfung ob ich in die 3te klasse aufsteigen darf).
Die aufgabenstellung ist das wir Datensätze bestehend aus einigen variablen mit RAF abspeichern sollen.
Wir haben es so gelernt das wir zuerst den platzverbrauch der variablen berechnen:
Das sieht bei mir so aus :
Es sind 2 int variablen vorhanden für die benötige ich 8 Bytes.
Und es sind 3 String variablen mit jeweils 20 zeichen vorhanden das macht nochmal 120 Bytes ( +10 sollten umlaute enthalten sein)
Das ergibt 138 bytes, bin mir nicht sicher ob das so stimmt^^
Dadurch erleichtern wir uns die arbeit in den nächsten Methoden um einiges
zb.: zeigerpositionieren mithilfe von "(satznummer-1) * datensatzlänge"
Hab das ganze dann ausprogrammiert und nach ewigen fehlermeldungen das etwas mit raf.readUTF(); nicht funktioniert habe ich versucht mir die länge der Datei zurückgeben zu lassen.
Als rückgabe erhielt ich 74 Bytes. Hab dann dementsprechend alles geändert und auf einmal funktionierts.
Die nun alles Entscheidende frage ist warum handelt es sich um 74 Bytes (pro datensatz) ?
Wenn ich bei meiner prüfung gefragt werde warum 74 gibt das einen rießen punkteabzug.
---------------------------------
Wieso sind in meiner txt Datei wenn ich diese per hand öffne seltsame zeichen und striche vorhanden ?
Wenn ich sie mit RAF auslese bekomme ich trotzdem eine einwandfrei lesbare antwort
---------------------------------
Wie muss ich es angehen wenn ich zeilenumbrüche in meiner Datei anzeigen will ? (\n)
Quellcode folgt
Meine Main methode
Java:
package RAF;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.io.Reader;
public class Main {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
File dateipfad = new File("D:\\Zwischenspeicher\\dokument.txt");
RandomAccess raf = new RandomAccess(dateipfad, 74); // Länge eines Datensatzes
raf.putRecord(0);
raf.putRecord(1);
raf.putRecord(2);
System.out.println(raf.getRecord(1));
raf.delRecord(1);
System.out.println(raf.getRecord(1));
}
}
Java:
package RAF;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.RandomAccessFile;
public class Record {
String vorname;
String nachname;
int alter;
int anzahlFinger;
String farbe;
public Record(String vorname, String nachname, int alter, int anzahlFinger, String farbe){ // Konstruktor
this.vorname = vorname;
this.nachname = nachname;
this.alter = alter;
this.anzahlFinger = anzahlFinger;
this.farbe = farbe;
}
public Record() { // Konstruktor
// TODO Auto-generated constructor stub
}
public void read(RandomAccessFile raf) throws IOException{
vorname = raf.readUTF();
nachname = raf.readUTF();
alter = raf.readInt();
anzahlFinger = raf.readInt();
farbe = raf.readUTF();
}
public String toString(){
return vorname + " " + nachname + " " + alter + " " + anzahlFinger + " " + farbe;
}
public void write(RandomAccessFile raf) throws IOException{ // Schreibt sie in die RAF datei
raf.writeUTF(vorname);
raf.writeUTF(nachname);
raf.writeInt(alter);
raf.writeInt(anzahlFinger);
raf.writeUTF(farbe);
}
public void createStdin(BufferedReader inp) throws IOException{ // Liest von der Konsole und korrigiert die Länge
String eingabe = inp.readLine();
String[] eingabeAufgeteilt;
eingabeAufgeteilt = eingabe.split(" ");
vorname = fillAndCut(eingabeAufgeteilt[0]);
nachname = fillAndCut(eingabeAufgeteilt[1]);
alter = Integer.parseInt(eingabeAufgeteilt[2]);
anzahlFinger = Integer.parseInt(eingabeAufgeteilt[3]);
farbe = fillAndCut(eingabeAufgeteilt[4]);
}
public String fillAndCut(String data){ // Das zurechtschreiben der Strings funktioniert einwandfrei deshalb schreibe ich hierzu keine Kommentare :)
if ( data.length() < 20){
while(data.length() < 20){
data = data + " ";
}
} else if (data.length() > 20){
char[] letters = data.toCharArray();
data = "";
for (int counter = 0; counter < 20; counter++){
data = data + letters[counter];
}
}
return data;
}
}
Java:
package RAF;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
public class RandomAccess{
BufferedReader inp = new BufferedReader(new InputStreamReader(System.in));
Record rec = new Record();
RandomAccessFile randomAF;
File datei;
int rafSize;
int anzahlZ = 0;
public RandomAccess(File dateipfad, int size) throws FileNotFoundException{
this.randomAF = new RandomAccessFile(dateipfad, "rw");
this.datei = dateipfad;
this.rafSize = size;
}
public void close() throws IOException{
randomAF.close();
}
public void putRecord(int number) throws IOException{ // Schreibt einen neuen Datensatz
rec.createStdin(inp);
if(number == -1){ // Am ende hinzufügen
randomAF.seek(datei.length());
rec.write(randomAF);
} else if (number >= 0 && number <= datei.length()/rafSize) { // Überschreiben
randomAF.seek(number*rafSize);
rec.write(randomAF);
}
}
public Record getRecord(int number) throws IOException { // Gibt einen Datensatz aus
randomAF.seek(number*rafSize);
rec.read(randomAF);
return rec;
}
public void delRecord(int number) throws IOException{ // Löscht den angegebenen Satz (Index) und überschreibt ihn mit dem Letzten dannach wir die datei verkürzt
randomAF.seek(datei.length()-rafSize);
rec.read(randomAF);
randomAF.seek(number*rafSize);
rec.write(randomAF);
randomAF.setLength(datei.length()-rafSize);
}
}
Würde mich sehr freuen wenn sich jemand finden würde der mir hilft