Hướng dẫn nén và giải nén trong java – GP Coder (Lập trình Java)

Để xử lý các công việc liên quan tới nén và giải nén, JDK cung cấp 2 package:

  • java.util.zip cung cấp các lớp hỗ trợ đọc và thi file .zip.
  • java.util.jar cung cấp các lớp hỗ trợ đọc và thi file .jar.

Các định dạng nén khác như: .rar, .7zip, … cần sử dụng một thư viện khác hỗ trợ.

Đọc ghi file zip sử dụng java.util.zip

java.util.zip coi các file/folder trong file zip là các ZipEntry. Một folder cũng là một ZipEntry.

Hãy xem nội dung file nén như sau :

Ví dụ nén file zip

Thực hiện những bước như sau :

  • Đọc file sử dụng FileInputStream.
  • Thêm tên file vào “ZipEntry“.
  • Xuất ra file “ZipOutputStream“.

package com.gpcoder.compress;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipFileExample {
	public static void main(String[] args) throws IOException {
		byte[] buffer = new byte[1024];

		OutputStream fos = new FileOutputStream("C:/demo/demo.zip");
		ZipOutputStream zos = new ZipOutputStream(fos);
		ZipEntry ze = new ZipEntry("sql.log"); // file name
		zos.putNextEntry(ze);
		
		FileInputStream in = new FileInputStream("C:/demo/data/sql.log");
		int len;
		while ((len = in.read(buffer)) > 0) {
			zos.write(buffer, 0, len);
		}
		in.close();
		
		zos.closeEntry();
		zos.close(); // remember close it
		System.out.println("Done");
	}
}

Thực thi chương trình trên, một file demo.zip được tạo ra trong thư mục C : / demo

Ví dụ nén thư mục


package com.gpcoder.compress;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipDirectoryExample {

	public static final String OUTPUT_ZIP_FILE = "C:/demo/demo.zip";
	public static final String SOURCE_FOLDER = "C:/demo/data";
	public static final byte[] BUFFER = new byte[1024];

	public static void main(String[] args) {
        File outputZipFile = new File(OUTPUT_ZIP_FILE);
		File inputDir = new File(SOURCE_FOLDER);
		zipDirectory(inputDir, outputZipFile);
	}

	/**
	 * Nén tất cả các tập tin và thư mục trong thư mục đầu vào
	 * @param inputDir Thư mục đầu vào
	 * @param outputZipFile Tập tin đầu ra
	 */
	public static void zipDirectory(File inputDir, File outputZipFile) {
        // Tạo thư mục cha cho file đầu ra (output file).
        outputZipFile.getParentFile().mkdirs();
 
        String inputDirPath = inputDir.getAbsolutePath();
 
        FileOutputStream fos = null;
        ZipOutputStream zipOs = null;
        try {
 
            List allFiles = listChildFiles(inputDir);
 
            // Tạo đối tượng ZipOutputStream để ghi file zip.
            fos = new FileOutputStream(outputZipFile);
            zipOs = new ZipOutputStream(fos);
            for (File file : allFiles) {
                String filePath = file.getAbsolutePath();
 
                System.out.println("Zipping " + filePath);
                // entryName: is a relative path.
                String entryName = filePath.substring(inputDirPath.length() + 1);
 
                ZipEntry ze = new ZipEntry(entryName);
                // Thêm entry vào file zip.
                zipOs.putNextEntry(ze);
                // Đọc dữ liệu của file và ghi vào ZipOutputStream.
                FileInputStream fileIs = new FileInputStream(filePath);
 
                int len;
                while ((len = fileIs.read(BUFFER)) > 0) {
                    zipOs.write(BUFFER, 0, len);
                }
                fileIs.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        	closeStream(zipOs);
        	closeStream(fos);
        }
 
    }

	private static void closeStream(OutputStream out) {
        try {
            out.close();
        } catch (Exception ex) {
        	ex.printStackTrace();
        }
    }
	
	/**
	 * Lấy danh sách các file trong thư mục: 
	 * 		bao gồm tất cả các file con, cháu,.. của thư mục đầu vào.
	 */
    private static List listChildFiles(File dir) throws IOException {
        List allFiles = new ArrayList<>();
 
        File[] childFiles = dir.listFiles();
        for (File file : childFiles) {
            if (file.isFile()) {
                allFiles.add(file);
            } else {
                List files = listChildFiles(file);
                allFiles.addAll(files);
            }
        }
        return allFiles;
    }

}

Thực thi chương trình trên, một file demo.zip được tạo ra trong thư mục C : / demo

Ví dụ liệt kê các file/folder trong file zip


package com.gpcoder.compress;

import java.io.FileInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class ReadZipFileExample {

	public static final String ZIP_FILE = "C:/demo/demo.zip";

	public static void main(String[] args) {
		ZipInputStream zis = null;
		try {
			// Tạo đối tượng ZipInputStream để đọc file zip.
			zis = new ZipInputStream(new FileInputStream(ZIP_FILE));

			ZipEntry entry = null;
			while ((entry = zis.getNextEntry()) != null) {
				if (entry.isDirectory()) {
					System.out.print("Directory: ");
				} else {
					System.out.print("File: ");
				}
				System.out.println(entry.getName());
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				zis.close();
			} catch (Exception e) {
			}
		}
	}
}

Kết quả thực thi chương trình trên :


File: docs\test1.txt
File: docs\test2.txt
File: javaInterviewQuestions.docx
File: note.txt
File: sql.log
File: table.xlsx

Ví dụ giải nén file zip


package com.gpcoder.compress;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class UnZipFileExample {

	public static final String ZIP_FILE = "C:\\demo\\demo.zip";
	public static final String OUTPUT_FOLDER = "C:\\demo\\output";
	public static final byte[] BUFFER = new byte[1024];

	public static void main(String[] args) {
		// Tạo thư mục Output nếu không tồn tại
		File folder = new File(OUTPUT_FOLDER);
		if (!folder.exists()) {
			folder.mkdirs();
		}

		ZipInputStream zis = null;
		try {
			zis = new ZipInputStream(new FileInputStream(ZIP_FILE));

			ZipEntry entry;
			File file;
			OutputStream os;
			String entryName;
			String outFileName;
			while ((entry = zis.getNextEntry()) != null) {
				entryName = entry.getName();
				outFileName = OUTPUT_FOLDER + File.separator + entryName;
				System.out.println("Unzip: " + outFileName);

				file = new File(outFileName);
				if (entry.isDirectory()) {
					// Tạo các thư mục.
					file.mkdirs();
				} else {
					// Tạo các thư mục nếu không tồn tại
					if (!file.getParentFile().exists()) {
						file.getParentFile().mkdirs();
					}
					// Tạo một Stream để ghi dữ liệu vào file.
					os = new FileOutputStream(outFileName);
					int len;
					while ((len = zis.read(BUFFER)) > 0) {
						os.write(BUFFER, 0, len);
					}
					os.close();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				zis.close();
			} catch (Exception e) {
			}
		}
	}
}

Thực thi chương trình trên, những file / thư mục trong file zip được giải nén trong thư mục C : / demo / output, console của eclipse hiển thị hiệu quả như sau :


Unzip: C:\demo\output\docs\test1.txt
Unzip: C:\demo\output\docs\test2.txt
Unzip: C:\demo\output\javaInterviewQuestions.docx
Unzip: C:\demo\output\note.txt
Unzip: C:\demo\output\sql.log
Unzip: C:\demo\output\table.xlsx

Ví dụ nén file zip với checksum


package com.gpcoder.compress.zip;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.Adler32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipWithChecksum {

	public static final String OUTPUT_ZIP_FILE = "C:/demo/data-checksum.zip";
	public static final String SOURCE_FOLDER = "C:/demo/data";
	public static final byte[] BUFFER = new byte[1024];

	public static void main(String[] args) {
		File outputZipFile = new File(OUTPUT_ZIP_FILE);
		File inputDir = new File(SOURCE_FOLDER);
		zipDirectory(inputDir, outputZipFile);
	}

	/**
	 * Nén tất cả các tập tin và thư mục trong thư mục đầu vào
	 * 
	 * @param inputDir Thư mục đầu vào
	 * @param outputZipFile Tập tin đầu ra
	 */
	public static void zipDirectory(File inputDir, File outputZipFile) {
		// Tạo thư mục cha cho file đầu ra (output file).
		outputZipFile.getParentFile().mkdirs();

		String inputDirPath = inputDir.getAbsolutePath();

		FileOutputStream fos = null;
		ZipOutputStream zos = null;
		CheckedOutputStream checksum = null;
		try {

			List allFiles = listChildFiles(inputDir);

			// Tạo đối tượng ZipOutputStream để ghi file zip.
			fos = new FileOutputStream(outputZipFile);

			// An output stream that also maintains a checksum of the data being
			// written. The checksum can then be used to verify the integrity of
			// the output data.
			checksum = new CheckedOutputStream(fos, new Adler32());
			zos = new ZipOutputStream(new BufferedOutputStream(checksum));

			for (File file : allFiles) {
				String filePath = file.getAbsolutePath();

				System.out.println("Zipping " + filePath);
				// entryName: is a relative path.
				String entryName = filePath.substring(inputDirPath.length() + 1);

				ZipEntry ze = new ZipEntry(entryName);
				// Thêm entry vào file zip.
				zos.putNextEntry(ze);
				// Đọc dữ liệu của file và ghi vào ZipOutputStream.
				FileInputStream fileIs = new FileInputStream(filePath);
				BufferedInputStream bis = new BufferedInputStream(fileIs, BUFFER.length);

				// read data to the end of the source file and write it to the zip
				// output stream.
				int length;
				while ((length = bis.read(BUFFER, 0, BUFFER.length)) > 0) {
					zos.write(BUFFER, 0, length);
				}
				fileIs.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			closeStream(zos);
			closeStream(fos);
		}

		// Print out checksum value
		if (checksum != null) {
			System.out.println("Checksum   : " + checksum.getChecksum().getValue());
		}

	}

	private static void closeStream(OutputStream out) {
		try {
			out.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * Lấy danh sách các file trong thư mục: bao gồm tất cả các file con, cháu,..
	 * của thư mục đầu vào.
	 */
	private static List listChildFiles(File dir) throws IOException {
		List allFiles = new ArrayList<>();

		File[] childFiles = dir.listFiles();
		for (File file : childFiles) {
			if (file.isFile()) {
				allFiles.add(file);
			} else {
				List files = listChildFiles(file);
				allFiles.addAll(files);
			}
		}
		return allFiles;
	}
}

Kết quả thực thi chương trình trên :


Zipping C:\demo\data\docs\test1.txt
Zipping C:\demo\data\docs\test2.txt
Zipping C:\demo\data\javaInterviewQuestions.docx
Zipping C:\demo\data\note.txt
Zipping C:\demo\data\sql.log
Zipping C:\demo\data\table.xlsx
Checksum   : 320788343

Ví dụ giải nén với checksum


package com.gpcoder.compress.zip;

import java.io.*;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.CheckedInputStream;
import java.util.zip.Adler32;

public class UnzipWithChecksum {

	public static final String ZIP_FILE = "C:/demo/data-checksum.zip";
	public static final String OUTPUT_FOLDER = "C:/demo/data-checksum";
	public static final byte[] BUFFER = new byte[1024];

	public static void main(String[] args) {

		// Tạo thư mục Output nếu không tồn tại
		File folder = new File(OUTPUT_FOLDER);
		if (!folder.exists()) {
			folder.mkdirs();
		}

		FileInputStream fis = null;
		ZipInputStream zis = null;
		CheckedInputStream checksum = null;
		try {
			fis = new FileInputStream(ZIP_FILE);

			// Creating input stream that also maintains the checksum of the
			// data which later can be used to validate data integrity.
			checksum = new CheckedInputStream(fis, new Adler32());
			zis = new ZipInputStream(new BufferedInputStream(checksum));

			// Read each entry from the ZipInputStream until no more entry found
			// indicated by a null return value of the getNextEntry() method.
			ZipEntry entry;
			File file;
			OutputStream os;
			String entryName;
			String outFileName;
			while ((entry = zis.getNextEntry()) != null) {
				entryName = entry.getName();
				outFileName = OUTPUT_FOLDER + File.separator + entryName;
				System.out.println("Unzip: " + outFileName);

				file = new File(outFileName);
				if (entry.isDirectory()) {
					// Tạo các thư mục.
					file.mkdirs();
				} else {
					// Tạo các thư mục nếu không tồn tại
					if (!file.getParentFile().exists()) {
						file.getParentFile().mkdirs();
					}
					// Tạo một Stream để ghi dữ liệu vào file.
					os = new FileOutputStream(outFileName);
					int len;
					while ((len = zis.read(BUFFER)) > 0) {
						os.write(BUFFER, 0, len);
					}
					os.close();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				zis.close();
			} catch (Exception e) {
			}
			try {
				zis.close();
			} catch (Exception e) {
			}
		}

		// Print out the checksum value
		if (checksum != null) {
			System.out.println("Checksum = " + checksum.getChecksum().getValue());
		}
	}
}

Kết quả thực thi chương trình trên :


Unzip: C:/demo/data-checksum\docs\test1.txt
Unzip: C:/demo/data-checksum\docs\test2.txt
Unzip: C:/demo/data-checksum\javaInterviewQuestions.docx
Unzip: C:/demo/data-checksum\note.txt
Unzip: C:/demo/data-checksum\sql.log
Unzip: C:/demo/data-checksum\table.xlsx
Checksum = 320788343

Ví dụ nén dữ liệu với gzip

User. java


package com.gpcoder.compress.gzip;

import java.io.Serializable;

public class User implements Serializable {

	private static final long serialVersionUID = -657143570052942947L;

	private Long id;
	private String username;
	private String password;
	private String firstName;
	private String lastName;

	@Override
	public String toString() {
		return "User [id=" + id 
				+ ", username=" + username 
				+ ", password=" + password 
				+ ", firstName=" + firstName
				+ ", lastName=" + lastName + "]";
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

}

GZipObjectDemo. java


package com.gpcoder.compress.gzip;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.zip.GZIPOutputStream;

public class GZipObjectDemo {
	public static String OUTPUT_FILE = "C:/demo/user.dat";
	
    public static void main(String[] args) {
        User admin = new User();
        admin.setId(1L);
        admin.setUsername("admin");
        admin.setPassword("secret");
        admin.setFirstName("System");
        admin.setLastName("Administrator");

        User foo = new User();
        foo.setId(2L);
        foo.setUsername("foo");
        foo.setPassword("secret");
        foo.setFirstName("Foo");
        foo.setLastName("Bar");

        System.out.println("Zipping....");
        System.out.println(admin);
        System.out.println(foo);
        try {
            FileOutputStream fos = new FileOutputStream(new File(OUTPUT_FILE));
            GZIPOutputStream gos = new GZIPOutputStream(fos);
            ObjectOutputStream oos = new ObjectOutputStream(gos);

            oos.writeObject(admin);
            oos.writeObject(foo);

            oos.flush();
            oos.close();

            gos.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Thực thi chương trình trên, một file user.dat được tạo ra trong thư mục C : / demo

Ví dụ giải nén dữ liệu với gzip


package com.gpcoder.compress.gzip;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.zip.GZIPInputStream;

public class UnGZipObjectDemo {
	
	public static String OUTPUT_FILE = "C:/demo/user.dat";
	
    public static void main(String[] args) {
        User admin = null;
        User foo = null;

        try {
            FileInputStream fis = new FileInputStream(new File(OUTPUT_FILE));
            GZIPInputStream gis = new GZIPInputStream(fis);
            ObjectInputStream ois = new ObjectInputStream(gis);

            admin = (User) ois.readObject();
            foo = (User) ois.readObject();

            ois.close();
            gis.close();
            fis.close();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }

        System.out.println(admin);
        System.out.println(foo);
    }
}

Kết quả thực thi chương trình trên :


User [id=1, username=admin, password=secret, firstName=System, lastName=Administrator]
User [id=2, username=foo, password=secret, firstName=Foo, lastName=Bar]

Ví dụ nén file gzip


package com.gpcoder.compress.gzip;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;

public class GZipCompressExample {

	public static final String OUTPUT_FILE = "C:/demo/gzip-output.gz";
	public static final String INPUT_FILE = "C:/demo/data/note.txt";
	public static final byte[] BUFFER = new byte[1024];

	public static void main(String[] args) throws IOException {
		// Create a file output stream the write the gzip result into
		// a specified file name.
		FileOutputStream fos = new FileOutputStream(OUTPUT_FILE);

		// Create a gzip output stream object with file output stream
		// as the argument.
		GZIPOutputStream gzos = new GZIPOutputStream(fos);

		// Create a file input stream of the file that is going to be
		// compressed.
		FileInputStream fis = new FileInputStream(INPUT_FILE);

		// Read all the content of the file input stream and write it
		// to the gzip output stream object.
		int length;
		while ((length = fis.read(BUFFER)) > 0) {
			gzos.write(BUFFER, 0, length);
		}

		// Finish file compressing and close all streams.
		fis.close();
		gzos.finish();
		gzos.close();
		System.out.println("Done!!!");
	}
}

Thực thi chương trình trên, một file gzip-output.gz được tạo ra trong thư mục C : / demo

Ví dụ giải nén file gzip


package com.gpcoder.compress.gzip;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;

public class GZipDecompressExample {

	public static final String INPUT_FILE = "C:/demo/gzip-output.gz";
	public static final String OUTPUT_FILE = "C:/demo/note.txt";
	public static final byte[] BUFFER = new byte[1024];

	public static void main(String[] args) throws IOException {
		// Create a file input stream to read the source file.
		FileInputStream fis = new FileInputStream(INPUT_FILE);

		// Create a gzip input stream to decompress the source
		// file defined by the file input stream.
		GZIPInputStream gzis = new GZIPInputStream(fis);

		// Create file output stream where the decompress result
		// will be stored.
		FileOutputStream fos = new FileOutputStream(OUTPUT_FILE);

		// Read from the compressed source file and write the
		// decompress file.
		int length;
		while ((length = gzis.read(BUFFER)) > 0) {
			fos.write(BUFFER, 0, length);
		}

		// Close the resources.
		fos.close();
		gzis.close();
		fis.close();
		System.out.println("Done!!!");
	}
}

Thực thi chương trình trên, một file note.txt được giải nén trong thư mục C : / demo

Đọc ghi file zip sử dụng thư viện zip4j

Download thư viện zip4j : thêm khai báo thư viện maven vào project .




    net.lingala.zip4j
    zip4j
    1.3.2


Ví dụ nén file zip với Password


package com.gpcoder.compress;

import java.io.File;

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;

public class Zip4jExample {

	public static final String OUTPUT_ZIP_FILE = "C:/demo/zip4jFolderExample.zip";
	public static final String SOURCE_FOLDER = "C:/demo/data";
	public static final String PASSWORD = "yourPassword";

	public static void main(String[] args) throws ZipException {
		ZipParameters parameters = new ZipParameters();
		parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
		parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);

		if (PASSWORD.length() > 0) {
			parameters.setEncryptFiles(true);
			parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
			parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
			parameters.setPassword(PASSWORD);
		}

		// Zip files inside a folder
		// An exception will be thrown if the output file already exists
		File outputFile = new File(OUTPUT_ZIP_FILE);
		ZipFile zipFile = new ZipFile(outputFile);

		File sourceFolder = new File(SOURCE_FOLDER);
		// false - indicates archive should not be split and 0 is split length
		zipFile.createZipFileFromFolder(sourceFolder, parameters, false, 0);

		// Zip a single file
		// An exception will be thrown if the output file already exists
		outputFile = new File("C:/demo/zip4jFileExample.zip");
		zipFile = new ZipFile(outputFile);
		File sourceFile = new File("C:/demo/data/sql.log");
		zipFile.addFile(sourceFile, parameters);
		System.out.println("Done!!!");
	}
}

Thực thi chương trình trên, 2 file zip4jFolderExample. zip và zip4jFileExample. zip được tạo ra trong thư mục C : / demo

Ví dụ giải nén file zip có Password


package com.gpcoder.compress;

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;

public class UnZip4jExample {

	public static final String ZIP_FILE = "C:/demo/zip4jFolderExample.zip";
	public static final String DESTINATION_FOLDER = "C:/demo/outputZip4j";
	public static final String PASSWORD = "yourPassword";
	
	public static void main(String[] args) throws ZipException {
		ZipFile zipFile = new ZipFile(ZIP_FILE);
		if (zipFile.isEncrypted()) {
			zipFile.setPassword(PASSWORD);
		}
		zipFile.extractAll(DESTINATION_FOLDER);
		System.out.println("Done!!!");
	}
}

Thực thi chương trình trên, nội dung file zip được giải nén trong thư mục C:/demo/outputZip4j

Đọc ghi file jar sử dụng java.util.jar

Về cơ bản việc đọc ghi file .jar không có gì khác biệt so với file .zip.

  • JarInputStream mở rộng từ ZipInputStream hỗ trợ thêm tính năng đọc các thông tin MANIFEST.
  • JarOutputStream mở rộng từ ZipOutputStream hỗ trợ thêm tính năng ghi thông tin MANIFEST.

Các file thư viện .jar thông thường của java thường có thông tin MANIFEST rất đơn giản.

Các file/ folder trong file .jar được coi là các JarEntry.

Ghi file jar


package com.gpcoder.compress;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;

public class CreateJarFileExample {

	public static final String JAR_FILE = "C:/demo/gpcoder.jar";
	public static final String INPUT_FOLDER = "C:/demo/classes";
	public static final byte[] BUFFER = new byte[1024];

	public static void main(String[] args) throws IOException {
		File outputZipFile = new File(JAR_FILE);
		File inputDir = new File(INPUT_FOLDER);
		createJarFile(inputDir, outputZipFile);
	}

	/**
	 * Nén tất cả các tập tin và thư mục trong thư mục đầu vào 
	 * 
	 * @param inputDirThư mục đầu vào
	 * @param outputJarFile Tập tin đầu ra
	 */
	public static void createJarFile(File inputDir, File outputJarFile) {
		// Tạo thư mục cha cho file đầu ra (output file).
		outputJarFile.getParentFile().mkdirs();
		String inputDirPath = inputDir.getAbsolutePath();

		// prepare Manifest file
		String version = "1.0.0";
		String author = "gpcoder.com";
		Manifest manifest = new Manifest();
		Attributes global = manifest.getMainAttributes();
		global.put(Attributes.Name.MANIFEST_VERSION, version);
		global.put(new Attributes.Name("Created-By"), author);

		FileOutputStream fos = null;
		JarOutputStream jos = null;
		try {

			List allFiles = listChildFiles(inputDir);

			// Tạo đối tượng JarOutputStream để ghi file jar.
			fos = new FileOutputStream(outputJarFile);
			jos = new JarOutputStream(fos, manifest);
			for (File file : allFiles) {
				String filePath = file.getAbsolutePath();

				System.out.println("Creating jar: " + filePath);
				// entryName: is a relative path.
				String entryName = filePath.substring(inputDirPath.length() + 1);

				// create JarEntry
				JarEntry je = new JarEntry(entryName);
				je.setComment("Creating Jar");
				je.setTime(Calendar.getInstance().getTimeInMillis());
				// Thêm entry vào file jar.
				jos.putNextEntry(je);

				// Đọc dữ liệu của file và ghi vào JarOutputStream.
				InputStream fileIs = new FileInputStream(filePath);
				int len;
				while ((len = fileIs.read(BUFFER)) > 0) {
					jos.write(BUFFER, 0, len);
				}
				fileIs.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			closeStream(jos);
			closeStream(fos);
		}

	}

	private static void closeStream(OutputStream out) {
		try {
			out.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * Lấy danh sách các file trong thư mục: 
	 * 		bao gồm tất cả các file con, cháu,.. của thư mục đầu vào.
	 */
	private static List listChildFiles(File dir) throws IOException {
		List allFiles = new ArrayList<>();

		File[] childFiles = dir.listFiles();
		for (File file : childFiles) {
			if (file.isFile()) {
				allFiles.add(file);
			} else {
				List files = listChildFiles(file);
				allFiles.addAll(files);
			}
		}
		return allFiles;
	}

}

Thực thi chương trình trên, một file gpcoder.jar được tạo ra trong thư mục C : / demo và console của eclipse hiển thị như sau :


Creating jar: C:\demo\classes\com\gpcoder\AbsoluteRelavativePathExample.class
Creating jar: C:\demo\classes\com\gpcoder\compress\CreateJarFileExample.class
Creating jar: C:\demo\classes\com\gpcoder\compress\ReadZipFileExample.class
Creating jar: C:\demo\classes\com\gpcoder\compress\UnZipFileExample.class
Creating jar: C:\demo\classes\com\gpcoder\compress\ZipDirectoryExample.class
Creating jar: C:\demo\classes\com\gpcoder\compress\ZipFileExample.class
Creating jar: C:\demo\classes\com\gpcoder\DeleteFileExample.class
Creating jar: C:\demo\classes\com\gpcoder\DeleteFolderExample.class
Creating jar: C:\demo\classes\com\gpcoder\TxtFileFilter.class
Creating jar: C:\demo\classes\com\gpcoder\TxtFileNameFilter.class

Đọc nội dung file jar


package com.gpcoder.compress;

import java.io.FileInputStream;
import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
import java.util.jar.Manifest;

public class ReadJarFileExample {

	public static final String JAR_FILE = "C:/demo/gpcoder.jar";

	public static void main(String[] args) {
		JarInputStream zis = null;
		try {
			// Tạo đối tượng JarInputStream để đọc file jar.
			zis = new JarInputStream(new FileInputStream(JAR_FILE));

			// Đọc thông tin Manifest:
			Manifest manifest = zis.getManifest();
			Attributes atts = manifest.getMainAttributes();
			String version = atts.getValue("Manifest-Version");
			String createdBy = atts.getValue("Created-By");
			System.out.println("Manifest-Version:" + version);
			System.out.println("Created-By:" + createdBy);

			JarEntry entry = null;
			while ((entry = zis.getNextJarEntry()) != null) {
				if (entry.isDirectory()) {
					System.out.print("Folder: ");
				} else {
					System.out.print("File: ");
				}
				System.out.println(entry.getName());
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				zis.close();
			} catch (Exception e) {
			}
		}
	}

}

Kết quả thực thi chương trình trên :


Manifest-Version:1.0.0
Created-By:gpcoder.com
File: com\gpcoder\AbsoluteRelavativePathExample.class
File: com\gpcoder\compress\CreateJarFileExample.class
File: com\gpcoder\compress\ReadZipFileExample.class
File: com\gpcoder\compress\UnZipFileExample.class
File: com\gpcoder\compress\ZipDirectoryExample.class
File: com\gpcoder\compress\ZipFileExample.class
File: com\gpcoder\DeleteFileExample.class
File: com\gpcoder\DeleteFolderExample.class
File: com\gpcoder\TxtFileFilter.class
File: com\gpcoder\TxtFileNameFilter.class

Đọc và ghi file rar

Để xử lý file .rar cần một thư viện mã nguồn mở, có thể sử dụng một trong các thư viện sau: JUnRar, java-unrar. Các ví dụ sử dụng các bạn xem trên source code của thư viện:

  • JUnRar: https://github.com/edmund-wagner/junrar
  • java-unrar: https://github.com/jukka/java-unrar

5.0

Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé!

Shares

Bình luận

phản hồi

Hướng dẫn nén và giải nén trong java – GP Coder (Lập trình Java)

Bài viết liên quan
Hotline 24/7: O984.666.352
Alternate Text Gọi ngay