Modification d'un fichier texte dans une archive ZIP en Java
Mon cas d'utilisation m'oblige à ouvrir un fichier txt, dire abc.txt qui est à l'intérieur d'une archive zip qui contient des paires clé-valeur dans la forme
cle1=valeur1
cle2=valeur2
.. et ainsi de suite, où chaque paire clé-valeur est dans une nouvelle ligne.
J'ai pour modifier une valeur correspondant à une clé donnée et de mettre le fichier texte dans une nouvelle copie de l'archive. Comment puis-je le faire en java?
Ma tentative à ce jour:
ZipFile zipFile = new ZipFile("test.zip");
final ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("out.zip"));
for(Enumeration e = zipFile.entries(); e.hasMoreElements(); ) {
ZipEntry entryIn = (ZipEntry) e.nextElement();
if(!entryIn.getName().equalsIgnoreCase("abc.txt")){
zos.putNextEntry(entryIn);
InputStream is = zipFile.getInputStream(entryIn);
byte [] buf = new byte[1024];
int len;
while((len = (is.read(buf))) > 0) {
zos.write(buf, 0, len);
}
}
else{
//I'm not sure what to do here
//Tried a few things and the file gets corrupt
}
zos.closeEntry();
}
zos.close();
source d'informationauteur Prabhakar
Vous devez vous connecter pour publier un commentaire.
Vous avait presque obtenu le droit. Une raison possible, le fichier a été montré comme corrompu est que vous pourriez avoir utilisé
dans la partie. Cela crée une nouvelle entrée dans le fichier zip contenant les informations à partir du fichier zip. Les informations existantes contient le nom de l'entrée(nom de fichier) et de ses CRC, entre autres choses.
Et puis, quand u essayez de mettre à jour le fichier texte et fermer le fichier zip, il lèvera une erreur CRC défini dans l'entrée et le CRC de l'objet que vous essayez d'écrire diffèrent.
Aussi peut-être u obtenez une erreur si la longueur du texte que vous êtes en train de remplacer différent de celui existant, c'est à dire que vous essayez de remplacer
avec
Cela revient au problème que la mémoire tampon que vous essayez d'écrire sur a de longueur différente de celle spécifiée.
Le code suivant assure que même si les données qui est remplacé est de moins en longueur que la longueur d'origine, pas de IndexOutOfBoundsExceptions se produire.
Java 7 a introduit un moyen beaucoup plus simple pour faire une archive zip manipulations - Les systèmes de fichiers API, qui permet d'accéder aux contenus d'un fichier en tant que système de fichiers.
Ailleurs beaucoup plus simple API, il est en train de faire la modification sur place et n'a pas besoin de réécrire l'autre (peu importe), les fichiers dans une archive zip (comme le fait dans la accepté de répondre).
Voici un exemple de code qui permet de résoudre des OP cas d'utilisation:
Pour plus d'archive zip manipulation des exemples, voir
demo/nio/zipfs/Demo.java
de l'échantillon que vous pouvez télécharger ici (JDK 8 Démos et exemples).Seulement un peu d'amélioration à:
Qui devrait être:
Afin de capturer tous les événements
La raison en est que, avec le premier, vous pourriez avoir de la "key1" en lecture et "=valeur1" dans le prochain, de ne pas être en mesure de capturer l'événement que vous souhaitez modifier