J'ai un fichier texte dynamique qui sélectionne le contenu d'une base de données en fonction de la requête de l'utilisateur. Je dois écrire ce contenu dans un fichier texte et le compresser dans un dossier dans un servlet. Comment dois-je faire cela?
StringBuilder sb =newStringBuilder();
sb.append("Test String");File f =newFile("d:\\test.zip");ZipOutputStream out =newZipOutputStream(newFileOutputStream(f));ZipEntry e =newZipEntry("mytext.txt");
out.putNextEntry(e);byte[] data = sb.toString().getBytes();
out.write(data,0, data.length);
out.closeEntry();
out.close();
Cela créera un zip à la racine de D:named test.zipqui contiendra un seul fichier appelé mytext.txt. Bien sûr, vous pouvez ajouter plus d'entrées zip et également spécifier un sous-répertoire comme celui-ci:
ZipEntry e =newZipEntry("folderName/mytext.txt");
Vous pouvez trouver plus d'informations sur la compression avec Java ici .
Pourquoi les deux lignes: sont-elles byte[] data = sb.toString().getBytes(); out.write(data, 0, data.length);incluses dans cet exemple de code? Quel est leur but?
Kaadzia
@kdzia, la première ligne convertit la valeur StringBuilder en un tableau d'octets, et la deuxième ligne prend ce tableau d'octets et l'écrit dans ZipEntry dans le fichier "test.zip". Ces lignes sont nécessaires car les fichiers Zip fonctionnent avec des tableaux d'octets, pas des chaînes.
OrangeWombat
3
Mais ... dans l'exemple ci-dessus, comment le StringBuilder contient-il autre chose que "Test String"? Je suis un peu confus par cela aussi. Si vous écrivez le sb.toString().getBytes()dans le fichier ZIP, je suppose que vous voudriez qu'il contienne les octets du fichier que vous zippez? Ou est-ce que je manque quelque chose?
RobA
3
@RobA vous ne manquez rien. Le StringBuilder est en effet destiné à contenir le texte que l'OP a obtenu de sa base de données. OP devrait simplement remplacer "Test String" (y compris les guillemets) par quelque chose comme getTextFromDatabase ()
Blueriver
Merci, @Blueriver
RobA
143
Java 7 intègre ZipFileSystem, qui peut être utilisé pour créer, écrire et lire un fichier à partir d'un fichier zip.
Map<String,String> env =newHashMap<>();// Create the zip file if it doesn't exist
env.put("create","true");
URI uri = URI.create("jar:file:/codeSamples/zipfs/zipfstest.zip");try(FileSystem zipfs =FileSystems.newFileSystem(uri, env)){Path externalTxtFile =Paths.get("/codeSamples/zipfs/SomeTextFile.txt");Path pathInZipfile = zipfs.getPath("/SomeTextFile.txt");// Copy a file into the zip fileFiles.copy(externalTxtFile, pathInZipfile,StandardCopyOption.REPLACE_EXISTING);}
Existe-t-il un moyen de faire fonctionner cela si l'extension ne l'est pas .zip? J'ai besoin d'écrire un .foofichier, qui est formaté exactement comme un fichier zip, mais avec une extension différente. Je sais que je pourrais créer un .zipfichier et le renommer, mais le créer avec le bon nom serait plus simple.
Troy Daniels
2
@TroyDaniels l'exemple ci-dessus fonctionne également avec une extension différente, car il utilise le jar:file:préfixe pour créer l'URI.
Sivabalan
10
Le seul problème qui peut apparaître ici est que cela ne fonctionnera pas si vous avez des répertoires. Ainsi, par exemple, si vous avez "/dir/SomeTextFile.txt" dans la pathInZipfilevariable, vous devez créer le 'dir' dans l'archive .zip. Pour cela, ajoutez simplement la ligne suivante: Files.createDirectories(pathInZipfile.getParent())avant d'appeler la Files.copyméthode.
D. Naumovich
comment régler le niveau de compression?
cdalxndr
34
Pour écrire un fichier ZIP, vous utilisez un ZipOutputStream. Pour chaque entrée que vous souhaitez placer dans le fichier ZIP, vous créez un objet ZipEntry. Vous passez le nom de fichier au constructeur ZipEntry; il définit les autres paramètres tels que la date du fichier et la méthode de décompression. Vous pouvez remplacer ces paramètres si vous le souhaitez. Ensuite, vous appelez la méthode putNextEntry de ZipOutputStream pour commencer à écrire un nouveau fichier. Envoyez les données du fichier au flux ZIP. Lorsque vous avez terminé, appelez closeEntry. Répétez pour tous les fichiers que vous souhaitez stocker. Voici un squelette de code:
FileOutputStream fout =newFileOutputStream("test.zip");ZipOutputStream zout =newZipOutputStream(fout);for all files
{ZipEntry ze =newZipEntry(filename);
zout.putNextEntry(ze);
send data to zout;
zout.closeEntry();}
zout.close();
Voici un exemple de code pour compresser un répertoire entier (y compris les sous-fichiers et sous-répertoires), il utilise la fonctionnalité d'arborescence de fichiers de marche de Java NIO.
Vous devez principalement créer deux fonctions. Le premier est writeToZipFile () et le second est createZipfileForOutPut .... puis appelez le createZipfileForOutPut ('nom de fichier .zip') `...
publicstaticvoid writeToZipFile(String path,ZipOutputStream zipStream)throwsFileNotFoundException,IOException{System.out.println("Writing file : '"+ path +"' to zip file");File aFile =newFile(path);FileInputStream fis =newFileInputStream(aFile);ZipEntry zipEntry =newZipEntry(path);
zipStream.putNextEntry(zipEntry);byte[] bytes =newbyte[1024];int length;while((length = fis.read(bytes))>=0){
zipStream.write(bytes,0, length);}
zipStream.closeEntry();
fis.close();}publicstaticvoid createZipfileForOutPut(String filename){String home =System.getProperty("user.home");// File directory = new File(home + "/Documents/" + "AutomationReport");File directory =newFile("AutomationReport");if(!directory.exists()){
directory.mkdir();}try{FileOutputStream fos =newFileOutputStream("Path to your destination"+ filename +".zip");ZipOutputStream zos =newZipOutputStream(fos);
writeToZipFile("Path to file which you want to compress / zip", zos);
zos.close();
fos.close();}catch(FileNotFoundException e){
e.printStackTrace();}catch(IOException e){
e.printStackTrace();}}
Si vous voulez décompresser sans logiciel, utilisez mieux ce code. Un autre code avec des fichiers pdf envoie une erreur lors de la décompression manuelle
Comme il m'a fallu un certain temps pour le comprendre, j'ai pensé qu'il serait utile de publier ma solution en utilisant Java 7+ ZipFileSystem
openZip(runFile);
addToZip(filepath);//loop construct;
zipfs.close();privatevoid openZip(File runFile)throwsIOException{Map<String,String> env =newHashMap<>();
env.put("create","true");
env.put("encoding","UTF-8");Files.deleteIfExists(runFile.toPath());
zipfs =FileSystems.newFileSystem(URI.create("jar:"+ runFile.toURI().toString()), env);}privatevoid addToZip(String filename)throwsIOException{Path externalTxtFile =Paths.get(filename).toAbsolutePath();Path pathInZipfile = zipfs.getPath(filename.substring(filename.lastIndexOf("results")));//all files to be stored have a common base folder, results/ in my caseif(Files.isDirectory(externalTxtFile)){Files.createDirectories(pathInZipfile);try(DirectoryStream<Path> ds =Files.newDirectoryStream(externalTxtFile)){for(Path child : ds){
addToZip(child.normalize().toString());//recursive call}}}else{// copy file to zip fileFiles.copy(externalTxtFile, pathInZipfile,StandardCopyOption.REPLACE_EXISTING);}}
Étant donné exportPathet en queryResultstant que variables String, le bloc suivant crée un results.zipfichier sous exportPathet écrit le contenu de queryResultsdans un results.txtfichier à l'intérieur du zip.
URI uri = URI.create("jar:file:"+ exportPath +"/results.zip");Map<String,String> env =Collections.singletonMap("create","true");try(FileSystem zipfs =FileSystems.newFileSystem(uri, env)){Path filePath = zipfs.getPath("/results.txt");byte[] fileContent = queryResults.getBytes();Files.write(filePath, fileContent,StandardOpenOption.CREATE);}
byte[] data = sb.toString().getBytes(); out.write(data, 0, data.length);
incluses dans cet exemple de code? Quel est leur but?sb.toString().getBytes()
dans le fichier ZIP, je suppose que vous voudriez qu'il contienne les octets du fichier que vous zippez? Ou est-ce que je manque quelque chose?Java 7 intègre ZipFileSystem, qui peut être utilisé pour créer, écrire et lire un fichier à partir d'un fichier zip.
Doc Java: fournisseur ZipFileSystem
la source
.zip
? J'ai besoin d'écrire un.foo
fichier, qui est formaté exactement comme un fichier zip, mais avec une extension différente. Je sais que je pourrais créer un.zip
fichier et le renommer, mais le créer avec le bon nom serait plus simple.jar:file:
préfixe pour créer l'URI.pathInZipfile
variable, vous devez créer le 'dir' dans l'archive .zip. Pour cela, ajoutez simplement la ligne suivante:Files.createDirectories(pathInZipfile.getParent())
avant d'appeler laFiles.copy
méthode.Pour écrire un fichier ZIP, vous utilisez un ZipOutputStream. Pour chaque entrée que vous souhaitez placer dans le fichier ZIP, vous créez un objet ZipEntry. Vous passez le nom de fichier au constructeur ZipEntry; il définit les autres paramètres tels que la date du fichier et la méthode de décompression. Vous pouvez remplacer ces paramètres si vous le souhaitez. Ensuite, vous appelez la méthode putNextEntry de ZipOutputStream pour commencer à écrire un nouveau fichier. Envoyez les données du fichier au flux ZIP. Lorsque vous avez terminé, appelez closeEntry. Répétez pour tous les fichiers que vous souhaitez stocker. Voici un squelette de code:
la source
Voici un exemple de code pour compresser un répertoire entier (y compris les sous-fichiers et sous-répertoires), il utilise la fonctionnalité d'arborescence de fichiers de marche de Java NIO.
Pour l'utiliser, il suffit d'appeler
et vous obtiendrez un fichier zip directoryToCompress.zip
la source
Contrôleur de démarrage Spring, compresser les fichiers dans un répertoire et peuvent être téléchargés.
la source
la source
Voici comment créer un fichier zip à partir d'un fichier source:
la source
Un seul fichier:
Plusieurs fichiers:
la source
Vous devez principalement créer deux fonctions. Le premier est writeToZipFile () et le second est createZipfileForOutPut .... puis appelez le createZipfileForOutPut ('nom de fichier .zip') `...
la source
Si vous voulez décompresser sans logiciel, utilisez mieux ce code. Un autre code avec des fichiers pdf envoie une erreur lors de la décompression manuelle
la source
Comme il m'a fallu un certain temps pour le comprendre, j'ai pensé qu'il serait utile de publier ma solution en utilisant Java 7+ ZipFileSystem
la source
la source
Étant donné
exportPath
et enqueryResults
tant que variables String, le bloc suivant crée unresults.zip
fichier sousexportPath
et écrit le contenu dequeryResults
dans unresults.txt
fichier à l'intérieur du zip.la source
En utilisant Jeka https://jeka.dev JkPathTree, c'est assez simple.
la source
Il existe une autre option en utilisant
zip4j
à https://github.com/srikanth-lingala/zip4jCréation d'un fichier zip avec un seul fichier / Ajout d'un seul fichier à un zip existant
new ZipFile("filename.zip").addFile("filename.ext");
Ounew ZipFile("filename.zip").addFile(new File("filename.ext"));
Créer un fichier zip avec plusieurs fichiers / Ajouter plusieurs fichiers à un zip existant
new ZipFile("filename.zip").addFiles(Arrays.asList(new File("first_file"), new File("second_file")));
Créer un fichier zip en y ajoutant un dossier / Ajouter un dossier à un zip existant
new ZipFile("filename.zip").addFolder(new File("/user/myuser/folder_to_add"));
Créer un fichier zip à partir d'un flux / Ajouter un flux à un zip existant
new ZipFile("filename.zip").addStream(inputStream, new ZipParameters());
la source