Twister's blog

Aller au contenu | Aller au menu | Aller à la recherche

Mot-clé - Informatique

Fil des billets - Fil des commentaires

mercredi, juillet 24 2013

Lire le contenu de fichiers dans un fichier zip en JAVA

Je viens de tomber sur un problème bête en Java, j'ai une application client/serveur avec un client qui envoie régulièrement des fichiers de logs au serveur sous forme de fichier ZIP. Le serveur doit décompresser les fichiers afin de la analyser pour en tirer des statistiques. Ce qui m'embêtait dans ce développement c'est qu'il faut dézipper les fichiers avant de pouvoir les analyser et que ce "dézippage" pourrait éventuellement laisser trainer des fichiers temporaires quelque part sur le serveur. Il me fallait donc une autre solution. J'en voyais 2 :

  • soit concatener les fichiers de logs en un seul fichier qu'il aurait suffit de gzipper pour pouvoir le lire avec un GZIPInputStream côté serveur.
  • soit permettre au serveur de lire de manière transparente les données de tous les fichiers contenus dans le zip.
La première solution aurait impliqué de faire des modifications sur le client qui utilise un système déjà existant (et standard pour notre application) pour envoyer ses fichiers ZIP, donc pas top. La seconde pose problème parce que le JDK ne fournit qu'un ZipInputStream qui permet de lire le Zip fichier par fichier, il faut en effet faire un appel à ZipInputStream.getNextEntry() entre chaque fichier pour passer à la suite. Comme l'ordre de lecture des fichiers n'a pas d'importance je décidais de faire un petit wrapper au stream afin qu'il soit capable de passer tout seul d'un fichier à l'autre. Et voilà le travail :

public static Reader acquireReader(File file) throws IOException {
       if (file.getName().endsWith(".zip")) {
           final ZipInputStream zis = new ZipInputStream(new FileInputStream(file));
           return new InputStreamReader(zis) {
               @Override
               public int read(char cbuf, int offset, int length) throws IOException {
                   int read = super.read(cbuf, offset, length);
                   if (read < length) {
                       if (read == -1) {
                           read = 0;
                       }
                       zis.getNextEntry();
                       read += super.read(cbuf, offset + read, length - read);
                   }
                   return read;
               }

               @Override
               public int read() throws IOException {
                   int c = super.read();
                   if (c == -1) {
                       zis.getNextEntry();
                       c = super.read();
                   }
                   return c;
               }
           };
       }
       return new FileReader(file);
   }

Comme vous pouvez le voire c'est relativement bateau :).

vendredi, février 29 2008

Informatique + 29/02

Putain d'après midi de merde!

15h50 : Coup de fil de 3 utilisateurs : Plus rien ne marche, les images ne se chargent pas. on ne comprends pas. Je leur répond qu'il doit y avoir un problème de serveur FTP, je regarde, pas de problèmes avec Filezilla.

16h10 : Après quelques test avec la librairie FTP que j'utilise (apache.commons.net.ftp) je me rends compte que mes listes de fichiers contiennent des null, null, null, null à la place de certaines entrées.

16h20 : J'appele les services infos pour savoir qu'elle connerie ils ont encore fait pour que ca arrete de fonctionner d'une seconde à l'autre. Évidemment un vendredi soir à 16h20 un we de départs en vacances plus personne n'est là...

16h40 : Je fini par avoir un gars plein de bonne volonté à l'autre bout de la France qui se connecte sur le serveur à Nanterre (logique de mon client : services infos dans le doux, serveurs à nanterre, cherchez pas à comprendre)...

/var plein, on vide... pas mieux...

17h : Finalement ca n'a pas l'air d'être le serveur, fillezilla et autre n'ont pas vraiment de problèmes, juste mon application qui n'est plus capable de récupérer les fichier envoyés dans la journée. Je teste sur notre serveur de développement, même problèmes. Serveur blanchi.

17h10 : J'avais remarqué des bizarreries sur les dates et que notement mon appli n'était pas capable d'afficher uniquement les fichiers qui étaient nouveaux. Tout à coup... TILT... 29/02/2008, année bisextile... TILT... Je recule la date du serveur de test d'un jour... pof, tout remarche... CHOUUUUUEEETTTE ! Je vais sur le site d'apache, je regarde le bug tracking et je trouve :

http://issues.apache.org/jira/browse/NET-190

J'adore les bugs qui se corrigent d'eux même, il suffit d'attendre le lendemain...

Avis à tous ceux qui utilisent Commons.net.ftp : bug tous les 4 ans à prévoir :p

vendredi, janvier 18 2008

J'ai honte!

Bouh, j'ai vraiment honte de moi, j'ai fais mon premier script ASP aujourd'hui, j'avais réussi à éviter cette technologie depuis des années et finalement je suis tombé dans le piège... Snif :-( ... Ca m'apprendra à vouloir rendre service. :-p

Enfin bon, la conclusion que j'en tire c'est que c'est quand même un beau langage de merde avec une syntaxe de merde. J'ai eu l'impression de coder en QBasic comme il y'a 15 ans. C'est vraiment moche, je crois que je ne vais pas m'en remettre... Vive le JAVA et le PHP :p

mardi, décembre 18 2007

Castor, le mapping JAVA-XML

Bon, en attendant de finir la série des articles sur GoogleMap en voici un petit sur le JAVA et le XML.

Lire la suite

jeudi, novembre 8 2007

Traitement de texte

Un ami viens de me faire part d'un article qu'il avait écrit il y a quelques temps que je trouve très sympa. J'ai donc décidé de vous en faire part :

After Word: l'avenir du traitement de texte (Stéphane Bortzmeyer)

C'est au sujet des traitements de textes et de leur avenir, je tiens à préciser que je suis complètement d'accord avec lui là dessus :p. Remarquez au passage qu'il a écrit ca en 2001 et que en 2007 finalement les choses ont assez peu évoluées... Damien, mister impression, ton avis la dessus ? :)

Pour ce qui est de la perte des cheveux chronique chez les catiamens, on verra ca plus tard ;)

- page 1 de 2