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)?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
"François Grondin" <francoisdotgrondin@bpr-cso.com> wrote in message
news:xe%Ud.23405$TB.8361@edtnps84...
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.
"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.