Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 

Vorheriges Thema | Nächstes Thema 

Autor Nachricht
 Betreff des Beitrags: skipBytes im RandomAccessFile funzt nicht :-(
BeitragVerfasst: 22. August 2009, 09:29 
1.Semester

Registriert: 21. August 2009, 23:26
Beiträge: 4
Hi,
habe eine Bin-Datei und eine zweite Bin-Datei (mit RandomAccessFile) in der ich mich aber nur über seek bewegen kann, die Methode skipBytes funzt nicht mit negativen Zahlen (also z.B. 0xFFFFFFFE).
Es wird zwar fertig kompiliert, beim Aufruf der Datei erhalte ich dann aber den Fehler:
  1. java Test Exception in thread "main" java.io.EOFException
  2. at java.io.RandomAccessFile.readByte(Unknown Source)
  3. at Test.main(Test.java:116)

Das Ärgernis ist nun folgendes:
  1. byte b000 = 0;
  2. int zurueck = -2;
  3. // Prog. selbst:
  4.     b000 = inStr.readByte();
  5.     outStr.writeByte(b000);
  6.     b000 = inStr.readByte();
  7.     outStr.writeByte(b000);
  8.     b000 = inStr.readByte();
  9.     outStr.writeByte(b000);
  10.     b000 = inStr.readByte();
  11.     outStr.writeByte(b000);  // Kopiert einfach die ersten 4 Bytes aus erster in zweite Datei
  12. // diese 3 Zeilen würden funzen, sind aber so Mist da ich relativ zum Ende zurück will ...
  13. //  outStr.seek(0);            // Zeiger der Ausgabedatei auf 1. Byte
  14. //  b000 = outStr.readByte();  // Das 1. Byte der Ausgabedatei einlesen
  15. //  outStr.seek(4);            // Zeiger der Ausgabedatei auf 5. Byte
  16.                              
  17.     outStr.skipBytes(zurueck);    // erste Variante (die super wäre, weg. Variable ...)
  18.     outStr.skipBytes(0xFE);       // zweite Variante - funzt mit positiven Zahlen
  19.     b000 = outStr.readByte();
  20.     outStr.writeByte(b000);
Es funzt so nur mit positiven Zahlen - also mit seek zurück und mit postitver Zahl innerhalb der Datei vorwärts (was so völlig Witzlos ist, da ich dann gleich mit seek arbeiten kann, aber zusätzlich innerhalb der Datei mein Sprungziel berechnen muss) - ich hoffe es hat irgend jemand im Net Erfahrung oder findet ein lauffähiges Beisp. - es gibt einige Dokumentationen die behaupten, es geht mit negativen Zahlen, aber ein lauffähiges Beisp. schuldig bleiben (und ich verstehe die angegebene "Pseudo-Syntax" nicht ...)
Außerdem wäre der Befehl sonst vollkommen überflüssig - ich glaube die Syntax ist einfach besonders anders (z.B. die Variable ist kein "Int" sondern ein "singned Int" oder etwas anderes Schlaues)

Danke im Vorraus


Nach oben
 Offline     Profil  
 
 Betreff des Beitrags: Re: skipBytes im RandomAccessFile funzt nicht :-(
BeitragVerfasst: 26. August 2009, 13:03 
Java-Tutor

Registriert: 28. April 2008, 14:50
Beiträge: 244
Wohnort: Berlin
Ich bin mir nicht sicher ob ich dein Problem genau verstanden habe, ich vermute an der Seek-Methode stört dich das es absolute Positionsangaben sind und bei Skip das es nur positive relative Positionsverschiebungen ermöglicht! Du möchtest aber auch negative Positionsverschiebungen.

Da es das scheinbar aktuell nicht gibt kannst du dir selber eine Funktion schreiben die das macht! Oder gar von der RandomAccessFile-Klasse ableiten und diese erweitern oder die Funktion SkipBytes überschreiben.

hier mal ein Vorschlag für eine Methode mit positiven und negativen relativen Positionsverschiebungen (die nicht abgeleitet wurde, deswegen wird die Datei mit übergeben)

  1.     /**
  2.         n .. Anzahl Bytes um die sich die aktuelle Position verändern soll
  3.         raFile .. Datei auf der gearbeitet werden soll
  4.        
  5.         return .. um wieviele Bytes sich der Pointer bewegt hat (kann weniger als n sein
  6.                   wenn das Dateiende oder der Anfang erreicht wurde)
  7.     */
  8.     public long moveBytes(int n, RandomAccessFile raFile) {
  9.         if (raFile == null) return 0;
  10.  
  11.         if (n<0) { //n ist negativ
  12.             long pos = raFile.getFilePointer();
  13.             if ((pos + n)<0) { //es soll vor den Dateianfang gesprungen werden
  14.                 raFile.seek(0);
  15.                 return -pos;
  16.             {
  17.                 raFile.seek(pos+n);
  18.                 return n;
  19.             }   
  20.         }else{
  21.             return raFile.skipBytes(n);
  22.         }
  23.  
  24.     }


Ich hab sie nicht getestet (sollte dennoch gehen), da es nur veranschaulichen soll wie schnell man ein solchen Problems beheben kann.

Gruß

Andre


Nach oben
 Offline     Profil  
 
 Betreff des Beitrags: Re: skipBytes im RandomAccessFile funzt nicht :-(
BeitragVerfasst: 29. August 2009, 20:11 
1.Semester

Registriert: 21. August 2009, 23:26
Beiträge: 4
Andre hat geschrieben:
... Du möchtest aber auch negative Positionsverschiebungen. ...
Ja, und ich habe eine Beschreibung im Net gefunden nach der das so einfach mit SkipBytes und der Angabe einer negativen Zahl geht ...
egal, habe jetzt begriffen, dass es so nicht geht ...
Andre hat geschrieben:
... Da es das scheinbar aktuell nicht gibt kannst du dir selber eine Funktion schreiben die das macht! Oder gar von der RandomAccessFile-Klasse ableiten und diese erweitern oder die Funktion SkipBytes überschreiben ...
Ich bin nicht sicher ob ich das so einfach kann - das Programmieren ist nur ein "notwendiges Übel" bei meiner Hobby-Tüftelei ... aber ich denke ich kann das was Du vorgegeben hast analysieren, verstehen und nachnutzen -
Danke, danke, danke, danke, danke, danke, danke,


Nach oben
 Offline     Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB © 2007 phpBB Group


Picksel Media Marco Block © 2006-2009 – ImpressumKontakt
Gestaltung und Umsetzung Tobias Losch, www.picksel-media.de