📦 Java ZIP Dosyası ve Klasör Sıkıştırma Rehberi (java.util.zip)
🧠 Bu Rehberde Ne Öğreneceksiniz?
Bu rehberde, Java’nın java.util.zip paketini kullanarak dosya ve klasörleri nasıl sıkıştırabileceğinizi öğreneceksiniz.
ZipOutputStream ve ZipEntry sınıflarını kullanarak tek bir dosyayı veya tüm bir dizini ZIP arşivine dönüştüreceksiniz.
🧩 1. ZIP İşleme Mantığı
Java’nın java.util.zip paketi, sıkıştırma (compression) işlemleri için temel araçları içerir:
- ZipOutputStream: ZIP dosyasına veri yazar.
- ZipEntry: ZIP arşivindeki her dosyayı veya klasörü temsil eder.
Bir dosyayı ZIP’e eklemek için yapılması gerekenler:
- Hedef ZIP dosyası için bir
FileOutputStreamoluşturun. ZipOutputStreamüzerinden yazma işlemini başlatın.- Her dosya için yeni bir
ZipEntryoluşturun. - Dosyayı okuyup ZIP akımına yazın.
- Akışları kapatın.
📁 2. Tek Bir Dosyayı ZIP’e Sıkıştırmak
Aşağıdaki örnek, /home/rabisu/logs/rapor.txt dosyasını rapor_arsiv.zip olarak sıkıştırır.
import java.io.*;
import java.util.zip.*;
public class ZipSingleFile {
public static void main(String[] args) {
File file = new File("/home/rabisu/logs/rapor.txt");
String zipFileName = "/home/rabisu/logs/rapor_arsiv.zip";
zipSingleFile(file, zipFileName);
}
private static void zipSingleFile(File file, String zipFileName) {
try (FileOutputStream fos = new FileOutputStream(zipFileName);
ZipOutputStream zos = new ZipOutputStream(fos);
FileInputStream fis = new FileInputStream(file)) {
ZipEntry entry = new ZipEntry(file.getName());
zos.putNextEntry(entry);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
System.out.println(file.getName() + " sıkıştırıldı: " + zipFileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
➡️ Bu örnek, tek bir dosyayı ZIP formatına dönüştürür.
📂 3. Bir Klasörü ZIP Arşivine Sıkıştırmak
Klasör sıkıştırmak için alt dizinlerdeki tüm dosyaları özyinelemeli (recursive) olarak işlemek gerekir.
import java.io.*;
import java.util.*;
import java.util.zip.*;
public class ZipDirectory {
private final List<String> fileList = new ArrayList<>();
public static void main(String[] args) {
File sourceDir = new File("/home/rabisu/web_projeleri/yedek");
String zipName = "/home/rabisu/web_projeleri/yedek.zip";
new ZipDirectory().zipDirectory(sourceDir, zipName);
}
public void zipDirectory(File dir, String zipFileName) {
try {
populateFileList(dir);
try (FileOutputStream fos = new FileOutputStream(zipFileName);
ZipOutputStream zos = new ZipOutputStream(fos)) {
for (String filePath : fileList) {
String relativePath = filePath.substring(dir.getAbsolutePath().length() + 1);
zos.putNextEntry(new ZipEntry(relativePath));
try (FileInputStream fis = new FileInputStream(filePath)) {
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
}
zos.closeEntry();
System.out.println("Sıkıştırılıyor: " + filePath);
}
System.out.println("Klasör başarıyla sıkıştırıldı: " + zipFileName);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void populateFileList(File dir) {
File[] files = dir.listFiles();
if (files == null) return;
for (File file : files) {
if (file.isFile()) fileList.add(file.getAbsolutePath());
else populateFileList(file);
}
}
}
➡️ Bu kod, belirtilen dizindeki tüm dosyaları sıkıştırır ve dizin yapısını korur.
🧮 4. Performans ve Bellek İpuçları
| 💡 Durum | 🧾 Açıklama |
|---|---|
| Buffer Boyutu | byte[1024] gibi küçük bloklar belleği verimli kullanır. |
| Göreceli Yollar | ZIP açıldığında klasör yapısını korumak için önemlidir. |
| Boş Klasörler | Varsayılan olarak eklenmez; istenirse manuel ZipEntry eklenmelidir. |
| Karakter Seti | UTF-8 kullanarak Türkçe dosya adlarında bozulmayı önleyin. |
❓ Sıkça Sorulan Sorular (SSS)
- Neden ZipEntry kullanmak zorundayım?
Her dosya veya klasör, ZIP arşivinde bir ZipEntry olarak temsil edilir. Bu nesne, ad ve sıkıştırma bilgilerini tutar.
- Neden göreceli dosya yolu kullanılıyor?
Mutlak yol kullanılırsa, ZIP açıldığında tam yol tekrar oluşturulur. Göreceli yol, dizin yapısının korunmasını sağlar.
- Bellek kullanımı nasıl optimize edilir?
Dosyaları parça parça (buffer) okuyarak belleğin tamamını doldurmadan sıkıştırma yapılabilir.
- ZIP dışında hangi formatlar desteklenir?
java.util.zip paketi ayrıca GZIP ve Deflater/Inflater sınıflarını da sunar.
- IOException hataları neden oluşur?
Genellikle erişim izni eksikliği, yanlış dosya yolu veya dosyanın başka bir işlem tarafından kilitlenmesi nedeniyle oluşur.
🎯 Sonuç
Bu rehberde, Java’da dosya ve klasörleri ZIP formatında sıkıştırmayı öğrendiniz. ZipOutputStream ve ZipEntry sınıflarını kullanarak arşivleme işlemlerini güvenli, performanslı ve kolay bir şekilde gerçekleştirebilirsiniz.
💬 Rabisu Bulut üzerinde Java uygulamanızı dağıtarak, dosya işlemlerinizi yüksek performanslı bir bulut ortamında hemen deneyebilirsiniz!