در این جلسه تیم کدگیت را با آموزش ساخت فایل زیپ در جاوا همراهی کنید. پیش نیاز این آموزش شامل موارد زیر است.
فایل زیپ (Zip File)
فرمت (Extension) فایل ZIP یک فرمت استاندارد فشرده سازی (Compressing) فایل است که دادهها (فایلها، پوشهها و…) را بدون هیچ گونه صدمهای پس از فشرده سازی توسط الگوریتمهای مخصوص، در خود نگه میدارد. این فرمت توسط شخص فلیپ والتر کَتز ( به انگلیسی: Phillip Walter Katz) و شرکت وی یعنی PKWARE توسعه یافته است. فرمت ZIP توسط اکثر سیستمعاملهای موجود پشتیبانی میشود.
نکته: نسخه جدیدتر این فرمت فایل ZIPX نام دارد.
استفاده از این گونه آرشیوها (Archives) مزایای مختلفی دارد؛ از جمله آن که، شخص میتواند با فشرده سازی چندین فایل، تنها یک فایل آرشیو بدست آمده با این فرمت را انتقال دهد، یا شخص میتواند برای محافظت از دادههای خود بر روی آنها رمز عبور قرار دهد، یا با فشرده سازی فایلهای خود فضای خالی حافظه جانبی (از جمله هارد دیسکها، SSDها و…) خود را افزایش دهد و… .
فایلهای ZIP دارای محدودیتهایی نیز هستند؛ از جمله آن که، حداقل حجم یک فایل ZIP (حتی بدون داشتن هیچگونه داده فشرده شده) 22 بایت و حداکثر حجم آن در فرمت ZIP استاندارد (حالت رایج فایلهای ZIP) برابر 4 گیگابایت است. البته میتوان با تبدیل کردن یک فایل ZIP به بخشهای چندگانه محدودیت حداکثر را از بین برد. به این صورت که تعدادی بخش (Part) به هم پیوسته (که البته این بخشها دارای محدودیت هستند) را در کنار هم قرار داد که بستگی به اندازه دادههای فشرده سازی شده و معین کردن حجم آنها از طرف کاربر، تعداد آنها نیز متغیر است(bytegate.ir/).
کد ساخت فایل زیپ در جاوا
برای ساخت فایل زیپ در جاوا ما از کتابخانه File و ZipOutputStream استفاده میکنیم. این کلاس ها در جاوا موجود است و فقط نیاز به import ساده دارید. به طور خلاصه باید مراحل زیر را برای ساخت فایل زیپ در جاوا انجام دهید:
- یک FileOutputStream بسازید برای نوشتن در فایلها(منظور ایجاد فایلها است).
- یک ZipOutputStream بسازید برای نوشتن در فایل zip.
- برای تک تک فایل هایی که میخواهیم درون زیپ قرار گیرد FileInputeStram میسازیم.
- برای تک تک فایل هایی که میخواهیم درون زیپ قرار گیرد Zip entry میسازیم تا یک فایل جدید در zip فایل ایجاد شود.
- داده های تک تک فایل ها را خوانده و درون زیپ فایل میریزیم.
کد فایل زیپ به صورت زیر است:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipTest {
public static void main(String[] args) {
String zipFile = "archive.zip";
String[] srcFiles = { "graph.txt", "graph2.txt"};
try {
// create byte buffer
byte[] buffer = new byte[1024];
FileOutputStream fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos);
for (int i = 0; i < srcFiles.length; i++) {
File srcFile = new File(srcFiles[i]);
FileInputStream fis = new FileInputStream(srcFile);
// begin writing a new ZIP entry, positions the stream to the
// start of the entry data
zos.putNextEntry(new ZipEntry(srcFile.getName()));
int length;
while ((length = fis.read(buffer)) > 0) {
zos.write(buffer, 0, length);
}
zos.closeEntry();
// close the InputStream
fis.close();
}
// close the ZipOutputStream
zos.close();
}
catch (IOException ioe) {
System.out.println("Error creating zip file: " + ioe);
}
}
}
همانطور که میبینید در کد فایل زیپ در جاوا یک آرایه از فایل هایی که میخواهیم در زیپ قرار گیرد ساختیم به نام srcFiles سپس طبق مطالب گفته شده zipoutputstream و fileoutputstream ایجاد کردیم. سپس یک حلقه به تعداد فایل ها نوشتیم یک به یک فایل ها را خواندیم و یک zipentry جدید برای هر یک ساختیم. در آخر نیز فایل خوانده شده را write کردیم.