17 Mart 2007

Dosyalarınızı Nasıl Sıkıştırırsınız?

Merhabalar,
Java'da dosyalarınızı ve klasörlerinizi hiç sıkıştırmayı denediniz mi? Denemediyseniz buyrun böyle alalım:) . Java'yı kullanarak dosya ve klasörlerinizi arşivleyen bir program yazabilirsiniz. Bunun için "java.util.zip" paketini kullanabilirsiniz. Bu iş için bu paketteki ZipFile, ZipEntry ve ZipOutputStream sınıflarını kullanabilirsiniz.
ZipEntry sınıfı zip dosyasında saklanacak her bir elemanı temsil eder. Bu elemanlar dosyalar ve klasörlerdir. ZipFile sınıfı bir zip dosyasını temsil eder. ZipOutputStream ise bir zip dosyasına için gerekli olan I/O sınıfıdır.
İsterseniz örneklere bakarak inceleyelim:

1. Bir dosyayı sıkıştırmak için:

byte[] readBuffer = new byte[2156];
int bytesIn = 0;

FileInputStream fis = null;
ZipOutputStream zos = null;
try {
zos = new ZipOutputStream(new FileOutputStream(""));
fis = new FileInputStream(<"Sıkıştırılacak dosyanın yolu">);
// dosya bir zip elemanı haline dönüştürülüyor
ZipEntry anEntry = new ZipEntry(fileToZip.getPath());
// Zip elemanı yazılmak üzere ZipOutputStream nesnesine veriliyor.
zos.putNextEntry(anEntry);
// Son olarak dosyanın içeriği stream'e yazılıyor.
while((bytesIn = fis.read(readBuffer)) != -1)
{
zos.write(readBuffer, 0, bytesIn);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// yazma işlemi bittikten sonra streamler kapatılıyor.
try {
fis.close();
zos.close();
} catch (IOException ex) {}
}

2. Bir klasörü sıkıştırmak için:
Klasör ve klasörün her bir elemanı ayrı bir entry olduğu için ayrı ayrı sıkıştırılır.

File dirTozip = new File(<"Sıkıştırılacak klasörün yolu">);
ZipOutputStream zos = null;
try
{
zos = new ZipOutputStream(new FileOutputStream(""));
// gerçekten klasör mü?
if ( !dirTozip.isDirectory() ) {
throw new IllegalArgumentException(dirTozip+" bir klasör olmalı!");
}
// klasörün içeriği alınıyor
String[] dirList = dirTozip.list();
// klasörün içindeki her bir eleman ayrı ayrı sıkıştırılıyor.
for(int i=0; i
{
File f = new File(dirTozip, dirList[i]);
if(f.isDirectory())
{
// eğer bu File nesnesi bir klasörse içindekileri sıkıştırmak için
// bu fonksiyon yeniden çağrılır (recursive)
// yeni bir klasörü elemanı oluşturuluyor.
ZipEntry anEntry = new ZipEntry(f.getPath()+"/");
zos.putNextEntry(anEntry);
zipDir(f, zos);

continue;
}
// Buraya ulaştıysak bir dosya sıkıştırabiliriz demektir.
zipFile(f, zos);
}
} catch(Exception e) {
e.printStackTrace();
} finally {
// yazma işlemi bittikten sonra streamler kapatılıyor.
try {
fis.close();
zos.close();
} catch (IOException ex) {}
}

3. Bir zip dosyasını açmak için:

Enumeration entries;
ZipFile zipFile;

try {
zipFile = new ZipFile(<"Açılacak zip'in yolu">);
entries = zipFile.entries();

byte[] buffer = new byte[1024];
int len;

while(entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry)entries.nextElement();

// eğer entry bir klasör ise klasör oluşturulmalı
if(entry.isDirectory()) {
(new File(entry.getName())).mkdir();
continue;
}

// Entry açılıyor....
InputStream in = zipFile.getInputStream(entry);
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(entry.getName()));

while((len = in.read(buffer)) >= 0)
out.write(buffer, 0, len);

in.close();
out.close();

}

zipFile.close();
} catch (IOException ioe) {
ioe.printStackTrace();
return;
}

Bu 3 işlemle basit bir arşivleme programı yazabilirsiniz. Kolay gelsin...

Hiç yorum yok: