OVH Cloud OVH Cloud

fichier zip ajout d'un fichier

8 réponses
Avatar
remy
bonjour

je cherche le moyen la methode pour ajouter un fichier a une archive zip
sans detruire ou recreer le fichier zip

j'ai cherche mais rien trouve

je cree un "format de fichier" avec plusieurs fichiers
un descripteur xml et des images sous un jeu sous gpl

donc je me suis naturellement rabattu vers les archives zip
mais chaque fois que je rajoute quelque chose cela recree une nouvelle
archive et donc supprime ce qui se trouve deja dedans

je veux eviter de tout mettre dans un repertoire tmp
et faire une archive a la fin pour eviter d'avoir des
images qui trainent un peu partout je voudrais directement travailler
sur l'archive

merci pour toutes pistes


import java.util.*;
import java.util.zip.*;
import java.io.*;


public class ZIP {



File fic;
FileOutputStream flux;
ZipOutputStream ficZIP;

ZIP(String archive) throws Exception
{
//creation d'une archive
fic = new File(archive);
flux = new FileOutputStream(fic);
ficZIP = new ZipOutputStream(flux);

}
public void addFichierZip(String emplacement,String nomSrc)throws
Exception
{


//fichier src
File ficSrc=new File(nomSrc);
FileInputStream src = new FileInputStream(ficSrc);
BufferedInputStream in = new BufferedInputStream( src);

//creation d'un fichier dans l'archive
String entreeFichier = emplacement+ficSrc.getName();
System.out.println("zip "+entreeFichier);
ZipEntry entreeZIP = new ZipEntry(entreeFichier);
ficZIP.putNextEntry(entreeZIP);

//copy src vers l'archive
BufferedOutputStream tamponSortie = new
BufferedOutputStream(ficZIP);
DataOutputStream ficDonnees = new DataOutputStream(tamponSortie);

byte[] read = new byte[128];
int len = 128;
while ((len = in.read(read)) > 0)
{
ficDonnees.write(read, 0, len);
ficDonnees.flush();
}

ficZIP.closeEntry();





}
public void closeAll()throws Exception
{
ficZIP.close();
flux.flush();
flux.close();
}
public boolean isExiste(String nom)
{
//ZipInputStream lectute=new ZipInputStream (fic);
//while(lecture.getNextEntry())
}
}





--
des conneries j'en ai dites oui oui je vous assure...
mais elles n'engagent que votre perception
remy

8 réponses

Avatar
remy
remy wrote:

je cherche le moyen la methode pour ajouter un fichier a une archive zip
sans detruire ou recreer le fichier zip



A ma connaissance, ce n'est pas possible.

Il est nécessaire d'en passer par un intermédiaire dans lequel tu dézipperas
le zip, y ajouteras le fichier que tu veux, puis rezipperas tout.




je veux bien mais si je regarde les src du jdk dans le fichier src.zip

mon code

fic = new File(archive);
flux = new FileOutputStream(fic);
ficZIP = new ZipOutputStream(flux);


//************************
public class ZipOutputStream extends DeflaterOutputStream implements
ZipConstants {

public ZipOutputStream(OutputStream out) {
super(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true));
usesDefaultDeflater = true;
}
//******************************
public class DeflaterOutputStream extends FilterOutputStream {

public DeflaterOutputStream(OutputStream out, Deflater def, int size) {
super(out);
if (out == null || def == null) {
throw new NullPointerException();
} else if (size <= 0) {
throw new IllegalArgumentException("buffer size <= 0");
}
this.def = def;
buf = new byte[size];
}

//**********************************

public class FilterOutputStream extends OutputStream {

public FilterOutputStream(OutputStream out) {
this.out = out;
}

//******************************
et si je regarde le code de la fct dans ZipOutputStream
il n'y a pas de creation de fichier

public void putNextEntry(ZipEntry e) throws IOException {
//***************************

donc j'ai regarde du cote du BufferedOutputStream


//***************************
public class BufferedOutputStream extends FilterOutputStream {

public BufferedOutputStream(OutputStream out) {
this(out, 8192);
}
//********************************

et dans mon code
BufferedOutputStream tamponSortie = new BufferedOutputStream(ficZIP);

et la ça merde il ne prend pas le bon OutputStream il prend celui du
constructeur "extends" et pas celui qui est passe en argument dans le
constructeur

ensuite il doit y avoir une creation quelque part puisque le
OutputStream n'est pas initialise


class FilterOutputStream


public class FilterOutputStream extends OutputStream {
^^^^^^^^^^^^

public FilterOutputStream(OutputStream out) {
this.out = out;
^^^^^^^^^^^^^^
}


si j'ai le temps je modifierai mon code pour voir si je peux trouver
quelque chose dans tous les cas merci

alors bug ou pas bug ? pour le debat








--
des conneries j'en ai dites oui oui je vous assure...
mais elles n'engagent que votre perception
remy


Avatar
remy

alors bug ou pas bug ? pour le debat


pas vraiment

public abstract class OutputStream implements Closeable, Flushable

cela ne regle rien dommage



--
des conneries j'en ai dites oui oui je vous assure...
mais elles n'engagent que votre perception
remy

Avatar
Hervé AGNOUX
remy wrote:


je cherche le moyen la methode pour ajouter un fichier a une archive zip
sans detruire ou recreer le fichier zip



A ma connaissance, ce n'est pas possible.

Il est nécessaire d'en passer par un intermédiaire dans lequel tu dézipperas
le zip, y ajouteras le fichier que tu veux, puis rezipperas tout.


--
Hervé AGNOUX
http://www.diaam-informatique.com

Avatar
alexandre cartapanis
remy wrote:

je cherche le moyen la methode pour ajouter un fichier a une archive zip
sans detruire ou recreer le fichier zip



A ma connaissance, ce n'est pas possible.

Il est nécessaire d'en passer par un intermédiaire dans lequel tu
dézipperas
le zip, y ajouteras le fichier que tu veux, puis rezipperas tout.




je veux bien mais si je regarde les src du jdk dans le fichier src.zip

mon code

fic = new File(archive);
flux = new FileOutputStream(fic);
ficZIP = new ZipOutputStream(flux);


//************************
public class ZipOutputStream extends DeflaterOutputStream implements
ZipConstants {

public ZipOutputStream(OutputStream out) {
super(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true));
usesDefaultDeflater = true;
}
//******************************
public class DeflaterOutputStream extends FilterOutputStream {

public DeflaterOutputStream(OutputStream out, Deflater def, int size) {
super(out);
if (out == null || def == null) {
throw new NullPointerException();
} else if (size <= 0) {
throw new IllegalArgumentException("buffer size <= 0");
}
this.def = def;
buf = new byte[size];
}

//**********************************

public class FilterOutputStream extends OutputStream {

public FilterOutputStream(OutputStream out) {
this.out = out;
}

//******************************
et si je regarde le code de la fct dans ZipOutputStream
il n'y a pas de creation de fichier

public void putNextEntry(ZipEntry e) throws IOException {
//***************************

donc j'ai regarde du cote du BufferedOutputStream


//***************************
public class BufferedOutputStream extends FilterOutputStream {

public BufferedOutputStream(OutputStream out) {
this(out, 8192);
}
//********************************

et dans mon code
BufferedOutputStream tamponSortie = new BufferedOutputStream(ficZIP);

et la ça merde il ne prend pas le bon OutputStream il prend celui du
constructeur "extends" et pas celui qui est passe en argument dans le
constructeur

ensuite il doit y avoir une creation quelque part puisque le
OutputStream n'est pas initialise


class FilterOutputStream


public class FilterOutputStream extends OutputStream {
^^^^^^^^^^^^

public FilterOutputStream(OutputStream out) {
this.out = out;
^^^^^^^^^^^^^^
}


si j'ai le temps je modifierai mon code pour voir si je peux trouver
quelque chose dans tous les cas merci

alors bug ou pas bug ? pour le debat



Heu juste une petite question, faut pas ouvrir le "flux" dans le code? :

fic = new File(archive);
flux = new FileOutputStream(fic);
ficZIP = new ZipOutputStream(flux);

Il me semble que y'a une histoire comme ca...

Deuxio, je te conseille d'utiliser plutôt les fichiers jar. C'est comme
zip, mais en mieux :)

Mais bon, je viens de tester avec winrar, et pour une archive zip dans
laquelle je veux rajouter un fichier, il la décompresse, rajoute un
fichier, et la recompresse ensuite.

--
Alexandre CARTAPANIS - Responsable Système et Réseau
Email
Gsm. 06 72 07 51 55

Macymed SARL - 9 bvd Kraëmer 13014 Marseille France
Tél. 04 91 48 31 58 - Fax. 04 91 02 36 47
Web http://www.macymed.fr - Email



Avatar
TestMan
Bonjour,

En tout cas, les classes en standard ne permettent pas de modifier un
fichier, donc la solution sera vers des classes externes.


Essayes peut-être :
https://truezip.dev.java.net/

A+

TM


bonjour

je cherche le moyen la methode pour ajouter un fichier a une archive zip
sans detruire ou recreer le fichier zip

j'ai cherche mais rien trouve

je cree un "format de fichier" avec plusieurs fichiers
un descripteur xml et des images sous un jeu sous gpl

donc je me suis naturellement rabattu vers les archives zip
mais chaque fois que je rajoute quelque chose cela recree une nouvelle
archive et donc supprime ce qui se trouve deja dedans

je veux eviter de tout mettre dans un repertoire tmp
et faire une archive a la fin pour eviter d'avoir des
images qui trainent un peu partout je voudrais directement travailler
sur l'archive

merci pour toutes pistes


Avatar
remy
remy wrote:

je cherche le moyen la methode pour ajouter un fichier a une archive
zip
sans detruire ou recreer le fichier zip



A ma connaissance, ce n'est pas possible.

Il est nécessaire d'en passer par un intermédiaire dans lequel tu
dézipperas
le zip, y ajouteras le fichier que tu veux, puis rezipperas tout.




je veux bien mais si je regarde les src du jdk dans le fichier src.zip

mon code

fic = new File(archive);
flux = new FileOutputStream(fic);
ficZIP = new ZipOutputStream(flux);


//************************
public class ZipOutputStream extends DeflaterOutputStream implements
ZipConstants {

public ZipOutputStream(OutputStream out) {
super(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true));
usesDefaultDeflater = true;
}
//******************************
public class DeflaterOutputStream extends FilterOutputStream {

public DeflaterOutputStream(OutputStream out, Deflater def, int size) {
super(out);
if (out == null || def == null) {
throw new NullPointerException();
} else if (size <= 0) {
throw new IllegalArgumentException("buffer size <= 0");
}
this.def = def;
buf = new byte[size];
}

//**********************************

public class FilterOutputStream extends OutputStream {

public FilterOutputStream(OutputStream out) {
this.out = out;
}

//******************************
et si je regarde le code de la fct dans ZipOutputStream
il n'y a pas de creation de fichier

public void putNextEntry(ZipEntry e) throws IOException {
//***************************

donc j'ai regarde du cote du BufferedOutputStream


//***************************
public class BufferedOutputStream extends FilterOutputStream {

public BufferedOutputStream(OutputStream out) {
this(out, 8192);
}
//********************************

et dans mon code
BufferedOutputStream tamponSortie = new BufferedOutputStream(ficZIP);

et la ça merde il ne prend pas le bon OutputStream il prend celui du
constructeur "extends" et pas celui qui est passe en argument dans le
constructeur

ensuite il doit y avoir une creation quelque part puisque le
OutputStream n'est pas initialise


class FilterOutputStream


public class FilterOutputStream extends OutputStream {
^^^^^^^^^^^^

public FilterOutputStream(OutputStream out) {
this.out = out;
^^^^^^^^^^^^^^
}


si j'ai le temps je modifierai mon code pour voir si je peux trouver
quelque chose dans tous les cas merci

alors bug ou pas bug ? pour le debat



Heu juste une petite question, faut pas ouvrir le "flux" dans le code? :


non a priorie cela fct tel quel

fic = new File(archive);
flux = new FileOutputStream(fic);
ficZIP = new ZipOutputStream(flux);

Il me semble que y'a une histoire comme ca...

Deuxio, je te conseille d'utiliser plutôt les fichiers jar. C'est comme
zip, mais en mieux :)

Mais bon, je viens de tester avec winrar, et pour une archive zip dans
laquelle je veux rajouter un fichier, il la décompresse, rajoute un
fichier, et la recompresse ensuite.



oui je crois bien qu'il va falloir que je me fasse une raison
et prenne cette option





--
des conneries j'en ai dites oui oui je vous assure...
mais elles n'engagent que votre perception
remy




Avatar
Hervé AGNOUX
remy wrote:


alors bug ou pas bug ? pour le debat



Excuse-moi mais je ne comprends RIEN à ton problème :-) Il y a bien des bugs
dans les paquetages IO et ZIP, mais quand on leur demande d'ouvrir un flux,
ils l'ouvrent.

Je te suggère de consulter les exemples du "The Java Developers Almanac 1.4"
à la section "zip", il y en a 9, cela devrait t'aider :
http://javaalmanac.com/egs/java.util.zip/pkg.html


--
Hervé AGNOUX
http://www.diaam-informatique.com

Avatar
Frederic Lachasse
"remy" wrote in message
news:4444aad2$0$21276$
bonjour

je cherche le moyen la methode pour ajouter un fichier a une archive zip
sans detruire ou recreer le fichier zip

j'ai cherche mais rien trouve

je cree un "format de fichier" avec plusieurs fichiers
un descripteur xml et des images sous un jeu sous gpl

donc je me suis naturellement rabattu vers les archives zip
mais chaque fois que je rajoute quelque chose cela recree une nouvelle
archive et donc supprime ce qui se trouve deja dedans

je veux eviter de tout mettre dans un repertoire tmp
et faire une archive a la fin pour eviter d'avoir des
images qui trainent un peu partout je voudrais directement travailler sur
l'archive


Malheureusement, il faut recréer une nouvelle archive et remplacer
l'ancienne. Ce que l'on peut éviter, c'est d'utiliser des fichiers
temporaires en écrivant dans la nouvelle archive au fur et à mesure que l'on
extrait de l'ancienne:

public void updateZip(File zipFile) throws IOException
{
File tmpFile = new File(zipFile.getPath() + ".tmp");

ZipInputStream in = new ZipInputStream(new FileInputStream(zipFile));
try {
ZipOutputStream out = new ZipOutpuStream(new
FileOutputStream(tmpFile));
byte[] buffer = new byte[4096];
try {
ZipEntry entry = in.getNextEntry();
while (entry != null) {
out.putNextEntry(entry);
int lg = in.read(buffer);
while (lg > 0) {
out.write(buffer, 0, lg);
lg = in.read(buffer);
}
out.closeEntry();
in.closeEntry();
entry = in.getNextEntry();
}
} finally {
out.close();
}
} finally {
in.close();
}

zipFile.delete();
tmpFile.renameTo(zipFile);
}

Evidemment, la méthode ci-dessus ne fait rien. Maintenant, il faut rajouter
la logique qui modifie l'archive. On peut faire aussi compliquer que l'on
veut. J'ai écrit une fois une méthode qui devait reconfigurer un jar en
remplaçant dans un jar un fichier de configuration, ainsi que remplacer
certaines des classes par d'autres venant d'un autre jar.

--
Frédéric Lachasse - ECP86