tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
3
ZUGRIFFE
273
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    rememba rememba ist offline Rookie
    Registriert seit
    Aug 2007
    Beiträge
    7
    Hallo.

    Ich lese Fortran-Binärdateien (das Lesen erfolgt also in Records mit einer bestimmten Länge) aus dem Jar-File aus, welches auch das eigentliche Programm enthält. Das löse ich wie folgt:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
     byte b[] = new byte[4096];     
        try {
            int i = filename.lastIndexOf("/");
            String str = filename.substring(i+1);
            InputStream is = Myclass.class.getClassLoader().getResourceAsStream(str);
            //File f = new File("/home/user/Desktop/"+str);
            //InputStream is = new FileInputStream(f);
            is.skip(rec);
            is.read(b);
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    Das so gelesene ByteArray übergebe ich mittels JNI an eine C-Routine, welche von diesem 512 8-Byle große Double-Zahlen ließt. Soweit so gut.

    Die Technik mit dem Einlesen mittels
    Code :
    1
    
    getClassLoader().getResourceAsStream(str)
    funktioniert nicht immer einwandfrei. Bei einigen Records liefert dieser InputStream falsche Daten, was sich dadurch äußert, das in der C-Routine falsche Werte gelesen werden.
    Lese ich hingegen mit dem Code ein, der im obigen Beispiel auskommentiert ist (also direkt vom FileSystem) funktioniert das EInlesen bei jedem Record immer einwandfrei. Der Fehler liegt also genau in diesen 3 Zeilen (nehme ich zu 95% an).

    Wie kann hier ein Fehler einstehen?
    Oder noch besser wie kann ich das Umgehen?
    Kann es an der Kompression des Jar-Files liegen?
    Gibt es andere Methoden um Dateien direkt aus dem Jar-File zu lesen (bei denen das Problem eventuell nicht auftritt)

    Bitte helft mir! Ich verzweifle so langsam daran.

    Gruß carsten
     

  2. #2
    rememba rememba ist offline Rookie
    Registriert seit
    Aug 2007
    Beiträge
    7
    Ich hab mal zum einfacheren Verständnis ein einfaches Beispielprogramm geschrieben, das die Problematik verdeutlicht:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
     
    public class ReadBin {
         public static void main(String[] args) {
            byte b1[] = new byte[4096];
            byte b2[] = new byte[4096];
            long rec = (36*4096);
            try {
                InputStream is1 = ReadBin.class.getClassLoader().getResourceAsStream("name");
                File f = new File(pfad+"/"+name);
                InputStream is2 = new FileInputStream(f);
                is1.skip(rec);
                is2.skip(rec);
                is1.read(b1);
                is2.read(b2);
                is1.close();
                is2.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            
            for(int i=0;i<b1.length;i++){
                if(b1[i] != b2[i]){
                    System.out.println(i+" ungleich");
                                    return;
                }
            }
            System.out.println("gleich");
        }
     
    }

    Ab einem bestimmten Byte sind die jeweils gelesenen Arrays verschieden Warum Hilfe!
     

  3. #3
    rememba rememba ist offline Rookie
    Registriert seit
    Aug 2007
    Beiträge
    7
    Ein Schritt in richtung Lösung!
    Es liegt an der Kompression.

    Also ich erstelle das Jar-Archiv mit Ant. Lösche mit einem Packprogramm die Binärdatei und füge sie unkompimiert wieder hinzu. -> Das Programm funktioniert jetzt so wie gewünscht.

    Ich habe alles zu Sicherheit noch einmal auf Windows ausprobiert. Hier lässt sich das Problem ähnlich lösen. Mit WinRar ist es sogar möglich die Binärdatei komprimiert hinzu zufügen -> und es läuft immer noch.

    Aud Windows habe ich kein ANT benutzt sondern die Exportfunktion von Eclipse. Das Phänomen war das selbe.

    Die Sache mit dem Ersetzen ist aufwendig und fürs Testen schlecht geeignet.

    Nun meine nächste Frage: Kann man bei ANT die Kompressionsrate angeben?
     

  4. #4
    Avatar von Billie
    Billie Billie ist offline Mitglied Platin
    Registriert seit
    Jan 2003
    Ort
    Arzl im Pitztal (Tirol)
    Beiträge
    510
    Kurz mal in der Dokumentation geschnüffelt und es gibt seit Ant 1.7 einen Parameter level für den Jar-Task:

    http://ant.apache.org/manual/CoreTasks/jar.html
     
    Fann Ég Fjalli Fallega Steina
    Faldi Dá Alla Vildi Deim Leyna
    Huldi Dar Hellisskúta Heillasteina
    Alla Mína Una eth slegu Óskasteina

Ähnliche Themen

  1. Advanced Guestbook 243
    Von 08154711 im Forum PHP
    Antworten: 5
    Letzter Beitrag: 04.12.07, 12:26
  2. [KNOW HOW] Swing Advanced
    Von janosch im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 12.08.04, 14:38
  3. advanced Forum? please
    Von F.o.G. im Forum PHP
    Antworten: 5
    Letzter Beitrag: 06.02.03, 18:23
  4. WIN 2k advanced server
    Von Schu im Forum Microsoft Windows
    Antworten: 2
    Letzter Beitrag: 20.06.01, 17:45

Stichworte