Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème d'utilisation de fichiers ZIP avec Java

1 réponse
Avatar
François Grondin
Bonjour à tous.

J'ai des problèmes liés à l'utilisation de fichiers ZIP avec Java. Je
travaille depuis quelques années au développement d'une application en Java
qui roule sous Windows 2000 et qui fait plusieurs choses que je ne
mentionnerai pas ici. Une des choses que l'application fait est la
construction et la lecture d'un fichier de reprise ZIP permettant
d'accélérer le prochain démarrage de l'application. Ce fichier ZIP peut
contenir jusqu'à 4 fichiers :

1. Un fichier situé dans le même répertoire que le fichier ZIP
2. Trois autres fichiers situés dans des sous-répertoires différents Puisque
le nom de ces fichiers pourraient être identiques, il a été convenu de
conserver le sous-répertoire pour les distinguer.

Lors de la création du fichier ZIP (en utilisant les classes ZipFile,
ZipEntry, ZipInputStream, etc.), aucun problème : tout fonctionne bien. Lors
de la lecture d'un fichier ZIP créé par l'application, pas de problème non
plus. Si je me crée un fichier ZIP similaire à mon fichier de reprise en
utilisant WinZip, l'application ne peut pas le lire!

Voici l'explication que j'ai trouvée. J'ai fait imprimer chaque entrée
(ZipFile.entries()) contenue dans le fichier ZIP créé par l'application
file, et chaque entrée du fichier ZIP créé manuellement par WinZip.

Le problème se situe à mes trois fichiers contenus dans des
sous-répertoires. Supposons qu'un de ces fichiers s'appelle
"répertoire\fichier.txt". Dans le fichier ZIP créé par l'application, le
fichier s'appelle "répertoire\fichier.txt". Dans le fichier ZIP que j'ai
créé manuellement, le fichier s'appelle "répertoire/fichier.txt" (le \ est
devenu /). Comme le nom que je cherche (avec "\") n'existe pas dans la liste
des entrées du fichier ZIP créé manuellement, la méthode
ZipEntry.getEntry(filename) retourne une valeur nulle, ce qui fait planter
l'application plus loin avec un NullPointerException.

Quelqu'un aurait-il une idée qui me permettrait de corriger le problème
(soit en modifiant l'écriture ou la lecture)?

Merci d'avance.

François Grondin

1 réponse

Avatar
Frédéric Lachasse
"François Grondin" wrote in message
news:xe%Ud.23405$
Bonjour à tous.

J'ai des problèmes liés à l'utilisation de fichiers ZIP avec Java. Je
travaille depuis quelques années au développement d'une application en
Java
qui roule sous Windows 2000 et qui fait plusieurs choses que je ne
mentionnerai pas ici. Une des choses que l'application fait est la
construction et la lecture d'un fichier de reprise ZIP permettant
d'accélérer le prochain démarrage de l'application. Ce fichier ZIP peut
contenir jusqu'à 4 fichiers :

1. Un fichier situé dans le même répertoire que le fichier ZIP
2. Trois autres fichiers situés dans des sous-répertoires différents
Puisque
le nom de ces fichiers pourraient être identiques, il a été convenu de
conserver le sous-répertoire pour les distinguer.

Lors de la création du fichier ZIP (en utilisant les classes ZipFile,
ZipEntry, ZipInputStream, etc.), aucun problème : tout fonctionne bien.
Lors
de la lecture d'un fichier ZIP créé par l'application, pas de problème non
plus. Si je me crée un fichier ZIP similaire à mon fichier de reprise en
utilisant WinZip, l'application ne peut pas le lire!

Voici l'explication que j'ai trouvée. J'ai fait imprimer chaque entrée
(ZipFile.entries()) contenue dans le fichier ZIP créé par l'application
file, et chaque entrée du fichier ZIP créé manuellement par WinZip.

Le problème se situe à mes trois fichiers contenus dans des
sous-répertoires. Supposons qu'un de ces fichiers s'appelle
"répertoirefichier.txt". Dans le fichier ZIP créé par l'application, le
fichier s'appelle "répertoirefichier.txt". Dans le fichier ZIP que j'ai
créé manuellement, le fichier s'appelle "répertoire/fichier.txt" (le est
devenu /). Comme le nom que je cherche (avec "") n'existe pas dans la
liste
des entrées du fichier ZIP créé manuellement, la méthode
ZipEntry.getEntry(filename) retourne une valeur nulle, ce qui fait planter
l'application plus loin avec un NullPointerException.

Quelqu'un aurait-il une idée qui me permettrait de corriger le problème
(soit en modifiant l'écriture ou la lecture)?


Pour être compatible avec WinZip, il faut toujours créer et lire les
fichiers ZIP en Java avec "/" comme séparateur de path. D'ailleurs, si tu
regardes les ZIP créés avec l'utilitaire jar, ils ont tous "/" et non "".
C'est ce qui fait que les fichiers ZIP ont un format indépendant de l'OS.

Un autre problème est dans l'utilisation de caractère non-ANSI dans les noms
de fichier/répertoire. WinZip et Java code ces caratères différements,
WinZip utilise le code page Windows et Java UTF-8. Et bêtement, il est
impossible au niveau de l'API Java de spécifier un autre encodage pour les
fichiers Zip.

La seule solution est d'éviter l'utilisation d'accent dans les noms de
fichier dans les Zip. A ce moment là, pas de problème.

--
Frédéric Lachasse - ECP86