Hallo zusammen,
ich bin dabei eine Anwendung zu schreiben, die Zip Dateien aktualisiert. Dabei habe ich folgende Methode übernommen
Link: https://subversivebytes.wordpress.com/2012/10/11/java-programmatically-update-jar-file/
Die Methode funktioniert an sich schon so wie es sein soll für noch nicht existierende Dateien. Wenn ich zum Beispiel eine Datei "HelloWorld.txt" im Zip und möchte diese Datei aktualisieren. Dann erstellt die Methode mir eine zweite "HelloWorld.txt" im Zip.
Beispiel:
Jetzt aktualisiere ich HellWorld.txt in die backup.zip Datei mit der oberen Methode, dann kommt folgendes als Ergebnis raus:
Wie kann ich die Methode so anpassen, dass er die HelloWorld.txt überschreibt, anstatt noch einen weiteren Entry packt?
Grüße
lam
ich bin dabei eine Anwendung zu schreiben, die Zip Dateien aktualisiert. Dabei habe ich folgende Methode übernommen
Link: https://subversivebytes.wordpress.com/2012/10/11/java-programmatically-update-jar-file/
Java:
public void updateJarFile(File srcJarFile, String targetPackage, File ...filesToAdd) throws IOException {
File tmpJarFile = File.createTempFile("tempJar", ".tmp");
JarFile jarFile = new JarFile(srcJarFile);
boolean jarUpdated = false;
try {
JarOutputStream tempJarOutputStream = new JarOutputStream(new FileOutputStream(tmpJarFile));
try {
//Added the new files to the jar.
for(int i=0; i < filesToAdd.length; i++) {
File file = filesToAdd[i];
FileInputStream fis = new FileInputStream(file);
try {
byte[] buffer = new byte[1024];
int bytesRead = 0;
JarEntry entry = new JarEntry(targetPackage+File.separator+file.getName());
tempJarOutputStream.putNextEntry(entry);
while((bytesRead = fis.read(buffer)) != -1) {
tempJarOutputStream.write(buffer, 0, bytesRead);
}
//System.out.println(entry.getName() + " added.");
}
finally {
fis.close();
}
}
//Copy original jar file to the temporary one.
Enumeration jarEntries = jarFile.entries();
while(jarEntries.hasMoreElements()) {
JarEntry entry = jarEntries.nextElement();
InputStream entryInputStream = jarFile.getInputStream(entry);
tempJarOutputStream.putNextEntry(entry);
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = entryInputStream.read(buffer)) != -1) {
tempJarOutputStream.write(buffer, 0, bytesRead);
}
}
jarUpdated = true;
}
catch(Exception ex) {
ex.printStackTrace();
tempJarOutputStream.putNextEntry(new JarEntry("stub"));
}
finally {
tempJarOutputStream.close();
}
}
finally {
jarFile.close();
//System.out.println(srcJarFile.getAbsolutePath() + " closed.");
if (!jarUpdated) {
tmpJarFile.delete();
}
}
if (jarUpdated) {
srcJarFile.delete();
tmpJarFile.renameTo(srcJarFile);
//System.out.println(srcJarFile.getAbsolutePath() + " updated.");
}
}
Die Methode funktioniert an sich schon so wie es sein soll für noch nicht existierende Dateien. Wenn ich zum Beispiel eine Datei "HelloWorld.txt" im Zip und möchte diese Datei aktualisieren. Dann erstellt die Methode mir eine zweite "HelloWorld.txt" im Zip.
Beispiel:
Java:
backup.zip
|-> HelloWorld.txt
Jetzt aktualisiere ich HellWorld.txt in die backup.zip Datei mit der oberen Methode, dann kommt folgendes als Ergebnis raus:
Java:
backup.zip
|-> HelloWorld.txt
|-> HelloWorld.txt
Wie kann ich die Methode so anpassen, dass er die HelloWorld.txt überschreibt, anstatt noch einen weiteren Entry packt?
Grüße
lam