Mam dynamiczny plik tekstowy, który pobiera zawartość z bazy danych zgodnie z zapytaniem użytkownika. Muszę zapisać tę zawartość do pliku tekstowego i spakować ją w folderze w serwlecie. Jak mam to zrobić?
149
Spójrz na ten przykład:
StringBuilder sb = new StringBuilder();
sb.append("Test String");
File f = new File("d:\\test.zip");
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(f));
ZipEntry e = new ZipEntry("mytext.txt");
out.putNextEntry(e);
byte[] data = sb.toString().getBytes();
out.write(data, 0, data.length);
out.closeEntry();
out.close();
Spowoduje to utworzenie w katalogu głównym D:
named, test.zip
który będzie zawierał jeden plik o nazwie mytext.txt
. Oczywiście możesz dodać więcej wpisów zip, a także określić podkatalog w ten sposób:
ZipEntry e = new ZipEntry("folderName/mytext.txt");
Więcej informacji na temat kompresji w Javie można znaleźć tutaj .
byte[] data = sb.toString().getBytes(); out.write(data, 0, data.length);
zawarte w tym przykładzie kodu? Jaki jest ich cel?sb.toString().getBytes()
do pliku ZIP, spodziewam się, że chcesz, aby zawierał bajty archiwizowanego pliku? A może coś mi brakuje?Java 7 ma wbudowany ZipFileSystem, który może być używany do tworzenia, zapisywania i odczytywania plików z pliku zip.
Dokument Java: dostawca ZipFileSystem
źródło
.zip
? Muszę napisać.foo
plik, który jest sformatowany dokładnie tak, jak plik zip, ale z innym rozszerzeniem. Wiem, że mógłbym utworzyć.zip
plik i zmienić jego nazwę, ale samo utworzenie go z odpowiednią nazwą byłoby prostsze.jar:file:
prefiksu do tworzenia identyfikatora URI.pathInZipfile
zmiennej „/dir/SomeTextFile.txt” , musisz utworzyć „dir” w archiwum .zip. W tym celu po prostu dodaj następną linię:Files.createDirectories(pathInZipfile.getParent())
przed wywołaniemFiles.copy
metody.Aby napisać plik ZIP, użyj ZipOutputStream. Dla każdego wpisu, który chcesz umieścić w pliku ZIP, tworzysz obiekt ZipEntry. Przekazujesz nazwę pliku do konstruktora ZipEntry; ustawia inne parametry, takie jak data pliku i metoda dekompresji. Jeśli chcesz, możesz zmienić te ustawienia. Następnie wywołujesz metodę putNextEntry obiektu ZipOutputStream, aby rozpocząć pisanie nowego pliku. Wyślij dane pliku do strumienia ZIP. Kiedy skończysz, zadzwoń do closeEntry. Powtórz te czynności dla wszystkich plików, które chcesz przechowywać. Oto szkielet kodu:
źródło
Oto przykładowy kod do kompresji całego katalogu (w tym plików podrzędnych i podkatalogów), wykorzystujący funkcję drzewa plików w języku Java NIO.
Aby z tego skorzystać, po prostu zadzwoń
a otrzymasz plik zip directoryToCompress.zip
źródło
Spring boot controller, spakuj pliki w katalogu i można je pobrać.
źródło
źródło
Oto jak tworzysz plik zip z pliku źródłowego:
źródło
Pojedynczy plik:
Wiele plików:
źródło
Musisz głównie stworzyć dwie funkcje. Pierwsza to writeToZipFile (), a druga to createZipfileForOutPut .... a następnie wywołanie funkcji createZipfileForOutPut ('nazwa pliku .zip') `…
źródło
Jeśli chcesz dekompresować bez oprogramowania, lepiej użyj tego kodu. Inny kod z plikami pdf wysyła błąd przy ręcznym dekompresji
źródło
Ponieważ zajęło mi to trochę czasu, pomyślałem, że pomocne byłoby opublikowanie mojego rozwiązania przy użyciu Java 7+ ZipFileSystem
źródło
źródło
Biorąc pod uwagę
exportPath
iqueryResults
jako zmienne typu String, następujący blok tworzyresults.zip
plik podexportPath
i zapisuje zawartośćqueryResults
doresults.txt
pliku wewnątrz zip.źródło
Korzystanie z Jeka https://jeka.dev JkPathTree jest dość proste.
źródło
Istnieje inna opcja, korzystając
zip4j
z https://github.com/srikanth-lingala/zip4jTworzenie pliku zip zawierającego jeden plik / Dodawanie pojedynczego pliku do istniejącego pliku ZIP
new ZipFile("filename.zip").addFile("filename.ext");
Lubnew ZipFile("filename.zip").addFile(new File("filename.ext"));
Tworzenie pliku ZIP z wieloma plikami / Dodawanie wielu plików do istniejącego pliku ZIP
new ZipFile("filename.zip").addFiles(Arrays.asList(new File("first_file"), new File("second_file")));
Tworzenie pliku ZIP przez dodanie do niego folderu / Dodanie folderu do istniejącego pliku ZIP
new ZipFile("filename.zip").addFolder(new File("/user/myuser/folder_to_add"));
Tworzenie pliku ZIP ze strumienia / Dodawanie strumienia do istniejącego pliku ZIP
new ZipFile("filename.zip").addStream(inputStream, new ZipParameters());
źródło