Jar reinschreiben

Hallo,
ich hab kürzlich einen Code gefunden, mit dem ich Dateien aus Jar-Archiven auslesen kann:

void anzeige( String datei )
{
Enumeration ent = jf.entries();
String buffer = new String();

System.out.println( "Datei " + datei + " in " + Name );
while ( ent.hasMoreElements() )
{
JarEntry jent = (JarEntry)ent.nextElement();
if ( jent.getName().compareTo( datei ) == 0 )
{
try
{
!!!Hier kam der Code rein, um den Inhalt von jent anzeigen zu lassen!!!

}
catch ( IOException e )
{
System.out.println( „Kann Datei " + datei +
" im Archiv nicht lesen“ );
}
break;
}
}
}
Kann mir vielleicht jemand einen Code-SChnipsel schicken, mit dem ich statt auslesen der Datei Strings in die Datei reinschreiben kann?

Viele Grüße Manny

Hallo Manfred.

ich hab kürzlich einen Code gefunden, mit dem ich Dateien aus
Jar-Archiven auslesen kann.

Kann mir vielleicht jemand einen Code-SChnipsel schicken, mit
dem ich statt auslesen der Datei Strings in die Datei
reinschreiben kann?

Das ist ein bisschen aufwändiger, da Java keine Methoden
bietet, um den Inhalt in der Jar-Datei direkt zu ändern.
Deshalb musst Du es etwas anders angehen:

  • ein neues Java-Archiv anlegen
  • alle nicht zu ändernden Daten in dieses neue Archiv kopieren
  • die zu ändernde Datei in dem Archiv hinzufügen
  • zum Schluss das alte Archiv löschen und das neue Archiv in
    das alte umbenennen

Beachte, dass das nicht bei signierten Archiven funktioniert,
da durch die Änderung die Prüfsumme nicht mehr übereinstimmt,
sowie mit gerade vom Java-Interpreter geöffneten Archiven , aus
denen der auszuführende Code ausgelesen wird. Die geöffneten
Archive sind vom Betriebssystem vor (Über)Schreiben geschützt.

Code mit einer Klasse JarEntryOutputStream , die eine Datei
in einem Java-Archiv verändert findet sich hier:
http://groups.google.de/group/comp.lang.java.help/br…

Testen kann man das mit der folgenden Methode:

public static void main(String[] args) throws Exception {
 if (args.length != 3) {
 System.out.println("Syntax: java JarEntryOutputStream JAR\_FILE FILE\_TO\_MODIFY TEST\_STRING");
 System.exit(1);
 }

 // get arguments:
 String sJarFile = args[0];
 String sFileToModify = args[1];
 String sTestString = args[2];

 // build the Jar URL to the local file system:
 String sJarUrl = "jar:file:" + sJarFile + "!/" + sFileToModify;
 System.out.println("Try to modify the file '" + sFileToModify 
 + "' that is part of the jar file '" + sJarFile 
 + "' (current directory is " + System.getProperty("user.dir") + ") ...");

 URL url = new URL(sJarUrl);
 OutputStream out = new JarEntryOutputStream(url);

 // write the new data to out:
 byte[] arrBytes = sTestString.getBytes();
 out.write(arrBytes);
 out.close();

 System.out.println("OK");
 }

Achtung : In der Klasse ist ein kleiner Bug, der eine
NullPointerException verursacht, statt

 jarFile.close();
 jarFile = null;
 entries = null;
 jarOutput.close();
 jarOutput = null;

 // Remove original JAR and move the temporary JAR to its location.
 File destFile = new File(jarFile.getName()); 

muss es heissen

 File destFile = new File(jarFile.getName());

 jarFile.close();
 jarFile = null;
 enumJarEntries = null;
 jarOutput.close();
 jarOutput = null;

Wie Du siehst, ist das Speichern von Daten in
Java-Archiven mühselig und fehleranfällig
.
Es sollte nur gemacht werden, wenn es sich wirklich
nicht vermeiden lässt.

Wieso speicherst Du die Daten nicht einfach in
einer normalen Datei oder benutzt die Java-Preferences
(siehe http://java.sun.com/j2se/1.4.2/docs/api/java/util/pr…)?

Gruß,
-Andreas.

Hallo Andreas!
Vielen Dank für die Antwort.
Ich hatte ursprünglich vor Benutzereinstellung direkt in eine txt-Datei in der Jar zu speichern. Aber das würde ja nicht gehen, weil das Programm ja ausgeführt wird, also nicht anschließend gelöscht werden kann. Vielen Dank für den Tipp mit den Java-Preferences. In meinem Java-Buch ist diese Klasse nicht beschrieben, hab aber eine Hilfe noch im Internet gefunden mit der es jetzt läuft!
Viele Grüße

Manfred