У меня есть динамический текстовый файл, который выбирает контент из базы данных в соответствии с запросом пользователя. Я должен записать это содержимое в текстовый файл и заархивировать его в папку в сервлете. Как мне это сделать?
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();
Это создаст почтовый индекс в корне D:named, test.zipкоторый будет содержать один единственный файл с именем mytext.txt. Конечно, вы можете добавить больше записей zip, а также указать такой подкаталог:
ZipEntry e =newZipEntry("folderName/mytext.txt");
Вы можете найти больше информации о сжатии с помощью Java здесь .
Почему две строки: byte[] data = sb.toString().getBytes(); out.write(data, 0, data.length);включены в этот пример кода? Какова их цель?
Каадзия
@kdzia, первая строка преобразует значение StringBuilder в байтовый массив, а вторая строка берет этот байтовый массив и записывает его в ZipEntry в файле «test.zip». Эти строки необходимы, потому что Zip-файлы работают с байтовыми массивами, а не со строками.
OrangeWombat
3
Но ... в приведенном выше примере, как в StringBuilder есть что-то кроме «Test String»? Я тоже немного смущен этим. Если вы пишете в sb.toString().getBytes()ZIP-файл, я ожидаю, что вы хотите, чтобы он содержал байты файла, который вы архивируете? Или я что-то упустил?
RobA
3
@RobA ты ничего не пропустил. StringBuilder действительно должен содержать текст, который ОП получил из своей базы данных. OP просто должен заменить «Test String» (включая кавычки) на что-то вроде getTextFromDatabase ()
Blueriver,
Спасибо, @Blueriver
RobA
143
Java 7 имеет встроенную систему ZipFileSystem, которую можно использовать для создания, записи и чтения файлов из 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);}
Есть ли способ сделать эту работу, если расширение не .zip? Мне нужно написать .fooфайл, который отформатирован точно так же, как файл zip, но с другим расширением. Я знаю, что могу создать .zipфайл и переименовать его, но просто создать его с правильным именем будет проще.
Трой Дэниелс
2
@TroyDaniels приведенный выше пример также работает с другим расширением, так как использует jar:file:префикс для создания URI.
Сивабалан
10
Единственная проблема, которая может появиться здесь, это то, что она не будет работать, если у вас есть каталоги. Так, например, если у вас есть «/dir/SomeTextFile.txt» в pathInZipfileпеременной, вам нужно создать «dir» внутри .zip архива. Для этого просто добавьте следующую строку: Files.createDirectories(pathInZipfile.getParent())перед вызовом Files.copyметода.
Д. Наумович
как установить уровень сжатия?
cdalxndr
34
Чтобы написать ZIP-файл, вы используете ZipOutputStream. Для каждой записи, которую вы хотите поместить в ZIP-файл, вы создаете объект ZipEntry. Вы передаете имя файла конструктору ZipEntry; он устанавливает другие параметры, такие как дата файла и метод распаковки. Вы можете переопределить эти настройки, если хотите. Затем вы вызываете метод putNextEntry объекта ZipOutputStream, чтобы начать запись нового файла. Отправьте данные файла в поток ZIP. Когда вы закончите, позвоните closeEntry. Повторите для всех файлов, которые вы хотите сохранить. Вот скелет кода:
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();
В основном вам нужно создать две функции. Первый - writeToZipFile (), а второй - createZipfileForOutPut ...., а затем вызвать createZipfileForOutPut ('имя файла .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();}}
Поскольку мне потребовалось некоторое время, чтобы понять это, я подумал, что будет полезно опубликовать мое решение с использованием 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);}}
Учитывая exportPathи queryResultsкак строковые переменные, следующий блок создает results.zipфайл в exportPathи записывает содержимое queryResultsв results.txtфайл внутри 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);
включены в этот пример кода? Какова их цель?sb.toString().getBytes()
ZIP-файл, я ожидаю, что вы хотите, чтобы он содержал байты файла, который вы архивируете? Или я что-то упустил?Java 7 имеет встроенную систему ZipFileSystem, которую можно использовать для создания, записи и чтения файлов из zip-файлов.
Java Doc: поставщик ZipFileSystem
источник
.zip
? Мне нужно написать.foo
файл, который отформатирован точно так же, как файл zip, но с другим расширением. Я знаю, что могу создать.zip
файл и переименовать его, но просто создать его с правильным именем будет проще.jar:file:
префикс для создания URI.pathInZipfile
переменной, вам нужно создать «dir» внутри .zip архива. Для этого просто добавьте следующую строку:Files.createDirectories(pathInZipfile.getParent())
перед вызовомFiles.copy
метода.Чтобы написать ZIP-файл, вы используете ZipOutputStream. Для каждой записи, которую вы хотите поместить в ZIP-файл, вы создаете объект ZipEntry. Вы передаете имя файла конструктору ZipEntry; он устанавливает другие параметры, такие как дата файла и метод распаковки. Вы можете переопределить эти настройки, если хотите. Затем вы вызываете метод putNextEntry объекта ZipOutputStream, чтобы начать запись нового файла. Отправьте данные файла в поток ZIP. Когда вы закончите, позвоните closeEntry. Повторите для всех файлов, которые вы хотите сохранить. Вот скелет кода:
источник
Вот пример кода для сжатия всего каталога (включая вложенные файлы и вложенные каталоги), он использует функцию дерева файлов ходьбы в Java NIO.
Чтобы использовать это, просто позвоните
и вы получите zip-файл directoryToCompress.zip
источник
Spring загрузочный контроллер, ZIP файлы в каталоге, и могут быть загружены.
источник
источник
Вот как вы создаете zip-файл из исходного файла:
источник
Отдельный файл:
Несколько файлов:
источник
В основном вам нужно создать две функции. Первый - writeToZipFile (), а второй - createZipfileForOutPut ...., а затем вызвать createZipfileForOutPut ('имя файла .zip') `…
источник
Если вы хотите распаковать без программного обеспечения, лучше используйте этот код. Другой код с файлами PDF отправляет ошибку при ручной распаковке
источник
Поскольку мне потребовалось некоторое время, чтобы понять это, я подумал, что будет полезно опубликовать мое решение с использованием Java 7+ ZipFileSystem
источник
источник
Учитывая
exportPath
иqueryResults
как строковые переменные, следующий блок создаетresults.zip
файл вexportPath
и записывает содержимоеqueryResults
вresults.txt
файл внутри zip.источник
Используя Jeka https://jeka.dev JkPathTree, это довольно просто.
источник
Есть еще один вариант, используя
zip4j
на https://github.com/srikanth-lingala/zip4jСоздание zip-файла с одним файлом / Добавление одного файла в существующий zip-файл
new ZipFile("filename.zip").addFile("filename.ext");
Илиnew ZipFile("filename.zip").addFile(new File("filename.ext"));
Создание zip-файла с несколькими файлами / Добавление нескольких файлов в существующий zip-файл
new ZipFile("filename.zip").addFiles(Arrays.asList(new File("first_file"), new File("second_file")));
Создание zip-файла путем добавления в него папки / Добавление папки в существующий zip-файл
new ZipFile("filename.zip").addFolder(new File("/user/myuser/folder_to_add"));
Создание zip-файла из потока / Добавление потока в существующий zip-файл
new ZipFile("filename.zip").addStream(inputStream, new ZipParameters());
источник