advanced Lesen aus Jar

rememba

Grünschnabel
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:
 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:
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
 
Ich hab mal zum einfacheren Verständnis ein einfaches Beispielprogramm geschrieben, das die Problematik verdeutlicht:

Code:
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!
 
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?
 
Zurück