• java壓縮和解壓縮Zip、Jar、Gzip文件

    1
    Java C/C++ Go 53990 次瀏覽

    我們經常會使用WinZIP等壓縮軟件將文件進行壓縮以方便傳輸。在java里面也提供了將文件進行壓縮以減少傳輸時的數據量的類,可以很方便的將文件壓縮成ZIP、JAR、GZIP等形式,GZIP主要是在Linux系統下的壓縮文件。

    下面主要講的就是ZIP形式的壓縮文件,而JAR、GZIP形式的壓縮文件也是類似的用法。

    ZIP是一種很常見的壓縮形式,在java中要實現ZIP的壓縮主要用到的是java.util.zip這個包里面的類。主要有ZipFile、 ZipOutputStream、ZipInputStream和ZipEntry。ZipOutputStream是用來壓縮文件 的,ZipInputStream和ZipFile是用來解壓縮文件的,在壓縮和解壓縮的過程中,ZipEntry都會用到。在java的Zip壓縮文件 中,每一個子文件都是一個ZipEntry對象。

     

    壓縮文件:

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.nio.charset.Charset;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    
    public class ZipOutputStreamTest {
    
    	public static void main(String args[]) throws IOException {
    		test1();
    		test2();
    	}
    	
    	public static void test1() throws IOException {
    		ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("D:\\testZip.zip"), Charset.forName("GBK"));
    		//實例化一個名稱為ab.txt的ZipEntry對象
    		ZipEntry entry = new ZipEntry("ab.txt");
    		//設置注釋
    		zos.setComment("zip測試for單個文件");
    		//把生成的ZipEntry對象加入到壓縮文件中,而之后往壓縮文件中寫入的內容都會放在這個ZipEntry對象里面
    		zos.putNextEntry(entry);
    		InputStream is = new FileInputStream("D:\\ab.txt");
    		int len = 0;
    		while ((len = is.read()) != -1)
    			zos.write(len);
    		is.close();
    		zos.close();
    	}
    	
    	public static void test2() throws IOException {
    		File inFile = new File("D:\\test");
    		ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("D:\\test.zip"), Charset.forName("GBK"));
    		zos.setComment("多文件處理");
    		zipFile(inFile, zos, "");
    		zos.close();
    	}
    	
    	public static void zipFile(File inFile, ZipOutputStream zos, String dir) throws IOException {
    		if (inFile.isDirectory()) {
    			File[] files = inFile.listFiles();
    			for (File file:files)
    				zipFile(file, zos, dir + "\\" + inFile.getName());
    		} else {
    			String entryName = null;
    			if (!"".equals(dir))
    				entryName = dir + "\\" + inFile.getName();
    			else
    				entryName = inFile.getName();
    			ZipEntry entry = new ZipEntry(entryName);
    			zos.putNextEntry(entry);
    			InputStream is = new FileInputStream(inFile);
    			int len = 0;
    			while ((len = is.read()) != -1)
    				zos.write(len);
    			is.close();
    		}
    
    	}
    	
    }
    解壓縮文件:
    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.nio.charset.Charset;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    import java.util.zip.ZipInputStream;
    
    public class ZipInputStreamTest {
    
    	public static void main(String args[]) throws IOException {
    		File file = new File("D:\\test.zip");//壓縮文件
    		ZipFile zipFile = new ZipFile(file);//實例化ZipFile,每一個zip壓縮文件都可以表示為一個ZipFile
    		//實例化一個Zip壓縮文件的ZipInputStream對象,可以利用該類的getNextEntry()方法依次拿到每一個ZipEntry對象
    		ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(file), Charset.forName("GBK"));
    		ZipEntry zipEntry = null;
    		while ((zipEntry = zipInputStream.getNextEntry()) != null) {
    			String fileName = zipEntry.getName();
    			File temp = new File("D:\\unpackTest\\" + fileName);
    			if (! temp.getParentFile().exists())
    				temp.getParentFile().mkdirs();
    			OutputStream os = new FileOutputStream(temp);
    			//通過ZipFile的getInputStream方法拿到具體的ZipEntry的輸入流
    			InputStream is = zipFile.getInputStream(zipEntry);
    			int len = 0;
    			while ((len = is.read()) != -1)
    				os.write(len);
    			os.close();
    			is.close();
    		}
    		zipInputStream.close();
    	}
    	
    }
    轉自:http://haohaoxuexi.iteye.com/blog/1235360

    相似問題

    相關經驗

    相關資訊

    相關文檔

  • sesese色