maven project
add dependencies (pom.xml)
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>14.0.1</version>
<type>jar</type>
</dependency>
<!-- log back -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.6</version>
</dependency>
<!-- log back -->
</dependencies>
logback สามารถดูได้จาก ใช้งาน Log Back
ZipFiles.java
package com.blogspot.na5cent.learning.zipfile;
import com.google.common.io.ByteStreams;
import com.google.common.io.InputSupplier;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.commons.io.FilenameUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author redcrow
*/
public class Zips {
private static final Logger LOG = LoggerFactory.getLogger(Zips.class);
//
public static final String FILENAME_EXTENSION = "zip";
private File fileOrFolder;
private List<String> files;
private Zips(File fileOrFolder) {
this.fileOrFolder = fileOrFolder;
files = new ArrayList<String>();
}
public static Zips fromFile(File fileOrFolder) throws FileNotFoundException {
if (!fileOrFolder.exists()) {
throw new FileNotFoundException(fileOrFolder.getName() + " not found.");
}
return new Zips(fileOrFolder);
}
public static Zips fromPath(String pathFileOrFolder) throws FileNotFoundException {
return fromFile(new File(pathFileOrFolder));
}
private void copyFile(final InputStream inputStream, OutputStream outputStream) throws IOException {
ByteStreams.copy(new InputSupplier<InputStream>() {
@Override
public InputStream getInput() throws IOException {
return inputStream;
}
}, outputStream);
}
public void toZipFile(File targetZipFile) throws IOException {
writeFile(targetZipFile);
}
public void toZipFile(String targetPathZipFile) throws IOException {
toZipFile(new File(targetPathZipFile));
}
public void toZipOutputStream(OutputStream outputStream) throws IOException {
zipToOutputStream(outputStream);
}
public void zip() throws IOException {
getZipFile();
}
public FileInputStream getZipFileInputStream() throws IOException {
return new FileInputStream(getZipFile());
}
private boolean isNotZipFile(File targetZipFile){
return !FILENAME_EXTENSION.equalsIgnoreCase(FilenameUtils.getExtension(targetZipFile.getName()));
}
private void writeFile(File targetZipFile) throws IOException {
if(isNotZipFile(targetZipFile)){
throw new IllegalArgumentException(targetZipFile.getName() + " --> filename extension is not zip");
}
OutputStream outputStream = null;
try {
outputStream = new FileOutputStream(targetZipFile);
zipToOutputStream(outputStream);
} finally {
if (outputStream != null) {
outputStream.close();
}
}
}
public File getZipFile() throws IOException {
String zipName = FilenameUtils.getBaseName(fileOrFolder.getName()) + "." + FILENAME_EXTENSION;
File targetZipFile = new File(fileOrFolder.getParent(), zipName);
writeFile(targetZipFile);
return targetZipFile;
}
private void zipToOutputStream(OutputStream outputStream) throws IOException {
walkFolder(fileOrFolder);
ZipOutputStream zipOutputStream = null;
try {
zipOutputStream = new ZipOutputStream(outputStream);
for (String file : files) {
putFileIntoZip(file, zipOutputStream);
}
} finally {
if (zipOutputStream != null) {
zipOutputStream.close();
}
}
}
private void putFileIntoZip(String file, ZipOutputStream zipOutputStream) throws IOException {
LOG.debug("zip file --> {}", file);
FileInputStream fileInputStream = null;
try {
ZipEntry entry = new ZipEntry(file);
zipOutputStream.putNextEntry(entry);
if (!file.endsWith(File.separator)) {
File entryFile = new File(fileOrFolder.getParent(), file);
fileInputStream = new FileInputStream(entryFile);
copyFile(fileInputStream, zipOutputStream);
}
} finally {
if (fileInputStream != null) {
fileInputStream.close();
}
zipOutputStream.closeEntry();
}
}
private boolean canNotWalk(File file){
File[] listFiles = file.listFiles();
return listFiles == null || listFiles.length == 0;
}
private void walkFolder(File parent) {
if (parent.isFile()) {
files.add(getRealPath(parent));
}
if (canNotWalk(parent)) {
if (parent.isDirectory()) {
files.add(getRealPath(parent) + File.separator);
}
return;
}
for (File child : parent.listFiles()) {
walkFolder(child);
}
}
private String getRealPath(File file) {
return file.getAbsolutePath().substring(fileOrFolder.getParent().length() + 1);
}
}
ZipsTest.java
package com.blogspot.na5cent.learning.zipfile;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
*
* @author redcrow
*/
public class ZipsTest {
public static void main(String[] args) throws FileNotFoundException, IOException {
File originalFile = new File("C:\\Users\\jittagornp\\Documents\\zipfile");
File zipFile = new File("C:\\Users\\jittagornp\\Documents\\test.zip");
Zips.fromFile(originalFile).toZipFile(zipFile);
}
}


สุดยอด เด๋วเก็บไว้ลองทำดูค่ะ
ตอบลบครับ ขอบคุณครับ
ตอบลบผมลองเขียนเองออกแบบเองดูก็สนุกดีน่ะครับ
มันทำให้เรารู้จริงในสิ่งที่เรากำลังทำ
ท้าทายดีครับกับการที่เขียนแล้วแชร์ให้คนอื่นเอา code เราไปใช้
ไม่รู้ว่าเขาจะว่ายังไง ถ้าเป็นสมัยก่อนคงโดนด่า (อ่านไม่รู้เรื่อง) 555+