2 Mart 2014 Pazar

Sıkıştırma

Aşağıda sıkıştırma ile ilgili notlarım var.

Huffman Coding
Huffman Kodlaması olasılık yöntemini kullanarak her byte'a daha kısa bitler verir. Görülme olasılığı daha fazla olan byte'lar daha kısa değerler alırlar. Böylece sıkıştırma gerçekleşir.

C#
ZipFile
OpenRead - Dosyayı dolaşabilmeyi sağlar
Örnek:
using System.IO.Compression;

ZipArchive zip = ZipFile.OpenRead("FileName.zip");
foreach (ZipArchiveEntry entry in zip.Entries)
{
    //use entry.FullName;
}
Java
Java ile gelen sınıflar java.util.zip paketinde bulunuyor. Bu sınıflar ile .gz uzantılı dosyalar yazılıp okunabilir.

GZIPInputStream - gz şeklinde sıkıştırılmış dosyayı açar
tar.gz şeklindeki bir dosyayı açma örneği:

FileInputStream instream= new FileInputStream(fileName);
GZIPInputStream ginstream =new GZIPInputStream(instream);
FileOutputStream outstream = new FileOutputStream(tarFileName);
byte[] buf = new byte[1024];
int len;
while ((len = ginstream.read(buf)) > 0)
{
    outstream.write(buf, 0, len);
}
ginstream.close();
outstream.close();
Bir başka örnek burada. Okuma örneği.

GZIPOutputStream 
GZIPOutputStream ile byte'ları sıkıştırma imkanı var. GZIPOutputStream sınıfı sadece sıkıştırmak için kullanılır. Eğer birden çok dosya sıkıştırılmak istenirse tar dosya arşivlemesi ile beraber kullanmak gerekir.
ByteArrayOutputStream os = new ByteArrayOutputStream();
GZIPOutputStream gos = new GZIPOutputStream(os);
gos.write("sıkıştırılacak içerik");
gos.close();
byte[] compressed = os.toByteArray();
Örnekte sıkıştırma gösteriliyor.

Apache Common
TarArchiveInputStream
Bu sınıf ile tar dosyasını dolaşma ve dosyanın tamamını açma imkanı var. Örnek:
TarArchiveInputStream inputStream = new TarArchiveInputStream(new FileInputStream(tarPath));
TarArchiveEntry entry;
while (null != (entry = inputStream.getNextEntry())) {
    if (entry.isDirectory()) {
        File directory = new File("." + entry.getName());
        directory.mkdir();
        continue;
    }
    FileOutputStream  outputStream = new FileOutputStream("." + entry.getName());
    IOUtils.copy(inputStream,outputStream);
    outputStream.close();
}
inputStream.close();
Bir başka örnek burada.

Tar dosyası içinde diğer tar dosyalarını dolaşmak için getNextEntry() metodu yerine getNextTarEntry() metodu kullanılabilir.

Hiç yorum yok:

Yorum Gönder