RandomAccessFile aus Jar

Status
Nicht offen für weitere Antworten.

carsten123

Mitglied
Hallo,

ich habe ein Problem. Und zwar möchte ich eine Datei aus einem Jar-Archiv als RandomAccessFile öffnen.
Ich weiß, dass das nicht so ohne Weiteres möglich ist. Ich muss es aber trotzdem irgendwie hinbekommen mittels wahlfreiem Zugriff auf diese Datei zugreifen zu können, ohne sie vorher aus dem Jar kopieren zu müssen.

Ist das irgendwie mit Java-Standardmittel möglich? Oder gibt es bereits implemenierte Bibliotheken, die so etwas können?

Falls, dies alles nicht der Fall ist, was haltet ihr davon so etwas zu implementieren. Ein sequentieller Zugriff auf die Datei ist ja möglich. Was wäre denn in diesem Fall ein effizentes Vorgehen?

Es wäre super wenn mir da jemand weiterhelfen könnte!!!

schon mal Vielen Dank

gruß Carsten
 

Wildcard

Top Contributor
Ein InputStream ist kein Problem und der übliche Weg.
Die File API greift jedoch nicht, da das jar schon eine Datei ist und Dateien keine Dateien enthalten können. Im jar selbst sind nur Zip (bzw jar) Entries. Zugreifbar ist das mit JarInputStream und JarOutputStream.
Solltest du, warum auch immer, dennoch meinen das du dafür die File API Zweckentfremden musst, dann hilft dir wohl TrueZip weiter.
 

carsten123

Mitglied
Hallo,

danke sehr für den Tipp. Ich mache es einfach mit einem InputStream
(
InputStream is = ... .class.getClassLoader().getResourceAsStream(str);
is.skip(rec);
is.read(b);
is.close();
)

Ich habe hierbei jedoch ein sehr seltsames Phänomen!!!!!
Ich lese mit dieser Methode Fortran-Binärdateien aus (Es wird also in Records gelesen).
Viele Records lassen sich dabei richtig auslesen. Bei einigen jedoch liefert der InputStream totalen SCHEI**** :mad: :mad:

Lese ich dagegen direkt vom Filesystem ein mit:
File f = new File("/home/user/Desktop/"+str);
InputStream is = new FileInputStream(f);
funktioniert es IMMER richtig.

Woran kann das liegen, dass der InputStream aus dem Jar falsche Daten liefert??? Kann es mit der Kompression des Jar-Files zusammenhängen?

Im verzweifle langsam...
 

Wildcard

Top Contributor
Glaube ich so erstmal nicht das der Stream etwas falsches liefern soll.
Wer hat das jar denn gebaut? Pack die Datei mal händisch aus dem jar aus und vergleiche binär mit deiner Referenzdatei. Vielleicht ist da eine ältere Version drin, oder so.
 

carsten123

Mitglied
Ist ja prinzipiell die richtige EInstellung, dass die Standard-Sachen alle richtig funktionieren.

Ich hab schon alles geprüft. Entpackt und n diff gemacht alles gleich.

Ich hab noch mal ein Beispielprogramm geschrieben, dass das Problem deutlicher zeigt:

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 beide Arrays verschieden.

Ach ja. Ich habe das Jar mit Ant gebaut:

Code:
<!--Ausfuehren des Jar-Archiv -->
	<target name="executeJar" depends="archive-application" description="Execute Jar-Archive">
		<java classname="startup.Startup" fork="true" spawn="false" classpath="./release/Mo...te-app.jar">
				<arg value="./release/inp"/>	
		</java>
	</target>
 

carsten123

Mitglied
so

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?
 

carsten123

Mitglied
Kompressionslevel in ant:

<jar destfile="...." level="0" >

</jar>

oder
mittels compress=... oder keepkompression

gruß carsten
 

Wildcard

Top Contributor
kommt mir höchst spanisch vor. Schonmal versucht ob es identisch ist wenn du das skip weg lässt?
Es muss sich entweder um einen Bug, oder ein falsch gepacktes Jar handeln (kann zB bei Umlauten im Dateinamen passieren, oder wenn ein Entry doppelt hinzugefügt wird).
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben