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.