2010-08-06 16 views
0

Je tente de lire dans un flux et d'enregistrer les images lues dans un fichier zip car cela va durer plusieurs jours et générer beaucoup trop de fichiers individuels.Comment enregistrer des images dans un fichier zip

J'ai maintenant un problème où je semble être incapable d'enregistrer des images dans un fichier zip. Le fil de travail que j'ai construit pour cela est ci-dessous. Je suis sûr que l'image est à l'ImageIO.write. Le résultat à la fin est cependant un fichier zip de jpgs vides. Je me demande si ImageIO n'écrit pas de propriété pour ZipOutputStream.

Merci pour votre aide.

public class ZipSaveWorker implements Runnable{ 

    public static ZipOutputStream out=null; 
    BufferedImage myImage; 
    private static int counter=0; 



    public void run() { 
     ZipEntry entry=new ZipEntry("video"+counter+".jpg"); 
     counter++; 
     try { 
      out.putNextEntry(entry); 
      ImageIO.write(myImage, ".jpg", out); 

     } catch (IOException ex) { 
      Logger.getLogger(ZipSaveWorker.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public ZipSaveWorker(BufferedImage image) 
    { 
     if (out==null) 
     { 
      try { 
       out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(new File("images" + File.separator + "video.zip")))); 
      } catch (FileNotFoundException ex) { 
       Logger.getLogger(ZipSaveWorker.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      counter=0; 
     } 

     myImage=image; 

    } 

    public static void closeStream() 
    { 
     try { 
      out.flush(); 
      out.close(); 
     } catch (IOException ex) { 
      Logger.getLogger(ZipSaveWorker.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 


} 

Répondre

1

L'erreur dans votre code est dans la ligne:

ImageIO.write(myImage, ".jpg", out); 

Il devrait être:

ImageIO.write(myImage, "jpg", out); 

Je suis pas sûr si vous devez appeler closeEntry() après chaque image a été écrit . Considérons ce que Stephen C écrit, ce code pourrait entraîner des fichiers zip corrompus si l'alimentation a été coupée ou la mort de la machine virtuelle. Pensez à faire des sauvegardes des fichiers zip plusieurs fois par semaine, peut-être même quelques fois par jour, pour vous assurer que vos sorties de plusieurs jours ne sont pas complètement ruinées (je suppose qu'une reprise peut être reprise).

+0

Je vais essayer et voir si cela fonctionne ce soir. Merci. – Mimyck

1

Je tente de lire dans un flux et enregistrer les images lues dans un fichier zip que cela va être en cours d'exécution sur plusieurs jours et générerait beaucoup trop de fichiers individuels.

Je ne suis pas convaincu par ce raisonnement. Le nombre réel de fichiers ne devrait pas vraiment importer autant. Vous pourriez perdre en moyenne un demi-bloc de disque (système de fichiers) par fichier, mais avec des disques téraoctets disponibles pour quelques centaines de dollars, c'est probablement insignifiant.

Mais le problème le plus important est ce qui se passe si votre application ... ou l'alimentation est coupée. Si vous écrivez toutes vos images directement dans un fichier ZIP, les chances sont que vous ne finirez avec rien, mais un fichier ZIP corrompu pour une course de plusieurs jours. Je m'attends à ce que le contenu du fichier ZIP soit principalement récupérable, mais seulement en utilisant une application tierce (non Java). Si les ressources du système de fichiers (espace disque, nombre d'inodes, peu importe) sont réalistes , alors peut-être vous devriez écrire un script pour s'exécuter (par exemple) une fois par heure et ZIP les fichiers qui ont été écrits dans le dernière heure et (peut-être) mettre le fichier ZIP ailleurs.

+0

D'accord. En fin de compte, je ne pense pas que vous sauveriez ce que vous * pensez * que vous économisez. Un fichier ZIP doit conserver un index de tous les fichiers d'une archive, tout comme un système de fichiers standard non compressé. Il est peu probable que vos fichiers JPEG se compressent bien en utilisant le format ZIP, donc vous vous prenez probablement dans le pied. – Quintus

+0

Le raisonnement pour un fichier zip était de sauver le système de fichiers d'avoir à indexer tous les jpgs individuels. J'ai peur de manquer d'INodes en les stockant séparément. Le problème n'était jamais de gagner de la place. – Mimyck

Questions connexes