# Datei in JAR-File aktualisieren



## Kaan (12. Mai 2005)

Hi,

ich hab' folgendes Probem: 
Mein Programm wird in einem JAR-File ausgeliefert. 

In diesem JAR-File befindet sich eine kleine "Datenbank" im txt Format. Lesen ist kein Problem, aber das schreiben! 

Wenn ich versuche, die Textdatei mit Hilfe der Klasse JarOutputStream und JarEntry neu zu erstellen, werden alle anderen Dateien im JAR-File gelöscht, also auch das Programm selbst^^ Vielleicht könnt ihr mir weiterhelfen...

Hier ein Codestück, wie ich es zur Zeit habe:


```
JarOutputStream out = new JarOutputStream(new FileOutputStream("Übersetzung.jar"));
out.putNextEntry(new JarEntry("datenbank/Daten.txt"));

out.write("Text".getBytes());
```

Übersetzung.jar ist dabei das JAR-File selbst, aus dem das Programm ausgeführt wird und datenbank ist ein package.


mfg Kaan


----------



## thE_29 (12. Mai 2005)

Du musst append sagen!

Sonst überschreibt dir der new FileOutputStream(blabla)

dein komplettes File mit einem leeren!

Also das hier


```
JarOutputStream out = new JarOutputStream(new FileOutputStream("Übersetzung.jar",true));
```

Aber ob er dir dann das Daten.txt überschreibt... (ich hoffe halt)


----------



## Kaan (12. Mai 2005)

Klappt leider nicht...

...trotzdem Danke für deine schnelle Antwort.


----------



## the Oracle (12. Mai 2005)

schließt du deinen JarOutputStream wieder??

out.close();


----------



## thE_29 (12. Mai 2005)

Und wenn du dir zuerst alle JarEntrys rausholst und eine tmp Kopie kurzweilen erstellst??

Also Übersetzung2.jar nennen (mach das Ü bitte aus dem Namen, sowas schmerzt....)

Dann aus deinem aktuellen alle Einträge rauslesen und dort reinkopieren und danach deinen neuen und dann das alte löschen und mit dem ersetzen!

Ist zwar bisi langwierig aber so sollts gehn!


----------



## Kaan (12. Mai 2005)

@the Oracle

Ja, hab ich, ich hab's auch schon mit out.closeEntry() versucht


@the_29
Ob Ü oder Ue..es funkt leider trotzdem nicht...

Die Idee mit dem auslesen des ganzen JAR-Files und dann wieder neu erstellen hatte ich schon...aber das ist mir zu unsicher, weil wenn der Vorgang aus irgendwelchen Gründen unterbrochen wird, dann sind alle Dateien korrupt.


----------



## thE_29 (12. Mai 2005)

also, das mit dem Ü ist wegen internationalen Namen!

Mein Name ist Jörg und ich schreib mich meistens nur mehr mit oe, alleine weil das dann wenigstens alle lesen können! (Ein Ami wird statt Übersetzung wahrscheinlich ?bersetzung haben... nicht gut!)

Es ist halt fraglich ob der das jar File überhaupt starten kann!


Und wegen dem korrupt, du löscht das alte File erst dann wenn das neue komplett da ist und das umbenennen wird schon nix schlimmes machen!

Da kann nix korrupt werden oder sonstiges, da du dein altes File ja erst ganz zum Schluss löscht!

Bzw. kopier deine aktuelle gleich am Anfang woanders hin und dann hast noch immer deine Sicherungskopie!


----------



## Kaan (12. Mai 2005)

Hui, das wird ja immer komplizierter...

ich werds mal versuchen, ansonsten lass ich es gut sein..^^

Danke für eure Hilfe


----------



## ozboss (23. Feb 2007)

Um mal diesen Thread wieder zu neuem Leben zu erwecken...

Ich habe auch vor die ausführende Jar-Datei zu aktualisieren, indem ich sie zunächst kopiere, dann die Kopie ändere und zum Schluss umbenenne.

Das kopieren des Jar-Archivs klappt auch soweit mit folgendem script:



```
JarInputStream jarIn = new JarInputStream(new FileInputStream("test.jar"));
JarOutputStream jarOut = new JarOutputStream(new FileOutputStream("test2.jar"));

JarEntry entry;
while((entry = jarIn.getNextJarEntry()) != null){
	jarOut.putNextEntry(entry);
	int i;
	while((i = jarIn.read()) != -1){
		jarOut.write(i);
	}
}

jarIn.close();
jarOut.close();
```


Einziges Manko: die getNextJarEntry()-Funktion greift nicht auf Unterarchive des Jar-Archiv zu.
So wird unter anderem auch die wichtige "META-INF" nicht kopiert...

Meine Frage an dieser Stelle:
Wie kann ich auf Unterarchive eines Jar-Archivs zugreifen (ohne diese unbedingt kennen zu müssen)?


----------



## thE_29 (23. Feb 2007)

Schau dir mal die Klasse JarFile an


----------



## ozboss (23. Feb 2007)

Ich habe festgestellt, dass getNextJarEntry() auf Ordner doch zugreift, aber die META-INF wird einfach nicht gebracht...wer weiß warum...

Ich muss wohl mit dem JarFile arbeiten, aber damit komme ich irgendwie nicht klar. Da läds nur die META-INF und stellt fest der entry sei leer (0 bytes). Die Exception verhindert das laden der weiteren Dateien.


```
String origJar = "test.jar";

JarOutputStream jarOut = new JarOutputStream(new FileOutputStream("test2.jar"));
			
JarFile jar = new JarFile(origJar);
Enumeration<JarEntry> entryEnum = jar.entries();

while(entryEnum.hasMoreElements()){ 
	entry = entryEnum.nextElement();
         
         // Das Textfeld gibt die JarInhalte aus. Es wird nur META-INF aufgelistet, dann kommt die IOException, die ziemlich weit unten abgefangen wird (hier nicht zu sehen)
	text.setText(text.getText() + entry.getName() + "\n");

	jarIn = new JarInputStream(jar.getInputStream(entry));
	try{
		jarOut.putNextEntry(entry);
	}catch(IOException e){}
	
         int i; 
	while((i = jarIn.read()) != -1){ 
		jarOut.write(i); 
	}
         jarOut.closeEntry();
	jarIn.close();
}
			
jarOut.putNextEntry(new JarEntry("extra"));
jarOut.write("Extradatei".getBytes());

jarOut.close();
```


Ich vermute das hat was mit dem InputStream zu tun...
Hat jemand eine Idee??


----------



## ozboss (24. Feb 2007)

Okay ich habs geschafft, der Fehler lag tatsächlich hierin:


```
jarIn = new JarInputStream(jar.getInputStream(entry));
```

Man muss den InputStream einfach so nehmen.


```
jarIn = jar.getInputStream(entry);
```

Dann gehts^^

So, jetzt das Ändern ausgewählter Daten in der Kopie und dann das Umbenennen... Wenn ich das schaffe, schreibe ich dann hier den ganzen Code rein.

Gruß


----------

