Ana içeriğe geç

📦 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:

  1. Hedef ZIP dosyası için bir FileOutputStream oluşturun.
  2. ZipOutputStream üzerinden yazma işlemini başlatın.
  3. Her dosya için yeni bir ZipEntry oluşturun.
  4. Dosyayı okuyup ZIP akımına yazın.
  5. 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 Boyutubyte[1024] gibi küçük bloklar belleği verimli kullanır.
Göreceli YollarZIP açıldığında klasör yapısını korumak için önemlidir.
Boş KlasörlerVarsayılan olarak eklenmez; istenirse manuel ZipEntry eklenmelidir.
Karakter SetiUTF-8 kullanarak Türkçe dosya adlarında bozulmayı önleyin.

❓ Sıkça Sorulan Sorular (SSS)

  1. 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.

  1. 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.

  1. 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.

  1. ZIP dışında hangi formatlar desteklenir?

java.util.zip paketi ayrıca GZIP ve Deflater/Inflater sınıflarını da sunar.

  1. 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!