1、.gz文件是linux下常见的压缩格式。使用 java.util.zip.GZIPInputStream即可,压缩是 java.util.zip.GZIPOutputStream
1 public static void unGzipFile(String sourcedir) {
2 String ouputfile = ""
3 try {
4 //建立gzip压缩文件输入流
5 FileInputStream fin = new FileInputStream(sourcedir)
6 //建立gzip解压工作流
7 GZIPInputStream gzin = new GZIPInputStream(fin)
8 //建立解压文件输出流
9 ouputfile = sourcedir.substring(0,sourcedir.lastIndexOf('.'))
10 ouputfile = ouputfile.substring(0,ouputfile.lastIndexOf('.'))
11 FileOutputStream fout = new FileOutputStream(ouputfile)
12
13 int num
14 byte[] buf=new byte[1024]
15
16 while ((num = gzin.read(buf,0,buf.length)) != -1)
17 {
18 fout.write(buf,0,num)
19 }
20
21 gzin.close()
22 fout.close()
23 fin.close()
24 } catch (Exception ex){
25 System.err.println(ex.toString())
26 }
27 return
28 }
2、zip文件,使用java.util.zip.ZipEntry 和 java.util.zip.ZipFile
1 /**
2 * 解压缩zipFile
3 * @param file 要解压的zip文件对象
4 * @param outputDir 要解压到某个指定的目录下
5 * @throws IOException
6 */
7 public static void unZip(File file,String outputDir) throws IOException {
8 ZipFile zipFile = null
9
10 try {
11 Charset CP866 = Charset.forName("CP866") //specifying alternative (non UTF-8) charset
12 //ZipFile zipFile = new ZipFile(zipArchive, CP866)
13 zipFile = new ZipFile(file, CP866)
14 createDirectory(outputDir,null)//创建输出目录
15
16 Enumeration<?>enums = zipFile.entries()
17 while(enums.hasMoreElements()){
18
19 ZipEntry entry = (ZipEntry) enums.nextElement()
20 System.out.println("解压." + entry.getName())
21
22 if(entry.isDirectory()){//是目录
23 createDirectory(outputDir,entry.getName())//创建空目录
24 }else{//是文件
25 File tmpFile = new File(outputDir + "/" + entry.getName())
26 createDirectory(tmpFile.getParent() + "/",null)//创建输出目录
27
28 InputStream in = null
29 OutputStream out = null
30 try{
31 in = zipFile.getInputStream(entry)
32 out = new FileOutputStream(tmpFile)
33 int length = 0
34
35 byte[] b = new byte[2048]
36 while((length = in.read(b)) != -1){
37 out.write(b, 0, length)
38 }
39
40 }catch(IOException ex){
41 throw ex
42 }finally{
43 if(in!=null)
44 in.close()
45 if(out!=null)
46 out.close()
47 }
48 }
49 }
50
51 } catch (IOException e) {
52 throw new IOException("解压缩文件出现异常",e)
53 } finally{
54 try{
55 if(zipFile != null){
56 zipFile.close()
57 }
58 }catch(IOException ex){
59 throw new IOException("关闭zipFile出现异常",ex)
60 }
61 }
62 }
63
64 /**
65 * 构建目录
66 * @param outputDir
67 * @param subDir
68 */
69 public static void createDirectory(String outputDir,String subDir){
70 File file = new File(outputDir)
71 if(!(subDir == null || subDir.trim().equals(""))){//子目录不为空
72 file = new File(outputDir + "/" + subDir)
73 }
74 if(!file.exists()){
75 if(!file.getParentFile().exists())
76 file.getParentFile().mkdirs()
77 file.mkdirs()
78 }
79 }
3、.tar.gz文件可以看做先用tar打包,再使用gz进行压缩。
使用org.apache.tools.tar.TarEntry org.apache.tools.tar.TarInputStream 和 org.apache.tools.tar.TarOutputStream
1 //------------------------------------------------------------------------------------------------------
2 /**
3 * 解压tar.gz 文件
4 * @param file 要解压的tar.gz文件对象
5 * @param outputDir 要解压到某个指定的目录下
6 * @throws IOException
7 */
8 public static void unTarGz(File file,String outputDir) throws IOException{
9 TarInputStream tarIn = null
10 try{
11 tarIn = new TarInputStream(new GZIPInputStream(
12 new BufferedInputStream(new FileInputStream(file))),
13 1024 * 2)
14
15 createDirectory(outputDir,null)//创建输出目录
16
17 TarEntry entry = null
18 while( (entry = tarIn.getNextEntry()) != null ){
19
20 if(entry.isDirectory()){//是目录
21 entry.getName()
22 createDirectory(outputDir,entry.getName())//创建空目录
23 }else{//是文件
24 File tmpFile = new File(outputDir + "/" + entry.getName())
25 createDirectory(tmpFile.getParent() + "/",null)//创建输出目录
26 OutputStream out = null
27 try{
28 out = new FileOutputStream(tmpFile)
29 int length = 0
30
31 byte[] b = new byte[2048]
32
33 while((length = tarIn.read(b)) != -1){
34 out.write(b, 0, length)
35 }
36
37 }catch(IOException ex){
38 throw ex
39 }finally{
40
41 if(out!=null)
42 out.close()
43 }
44 }
45 }
46 }catch(IOException ex){
47 throw new IOException("解压归档文件出现异常",ex)
48 } finally{
49 try{
50 if(tarIn != null){
51 tarIn.close()
52 }
53 }catch(IOException ex){
54 throw new IOException("关闭tarFile出现异常",ex)
55 }
56 }
57 }
使用到的包头有:
1 import java.io.BufferedInputStream
2 import java.io.File
3 import java.io.FileInputStream
4 import java.io.FileOutputStream
5 import java.io.IOException
6 import java.io.InputStream
7 import java.io.OutputStream
8
9 import java.nio.charset.Charset
10 import java.util.Enumeration
11 import java.util.zip.GZIPInputStream
12 import java.util.zip.ZipEntry
13 import java.util.zip.ZipFile
14
15 import org.apache.tools.tar.TarEntry
16 import org.apache.tools.tar.TarInputStream
17 import org.apache.tools.tar.TarOutputStream
//引入jtar-(版本号).jar
public void readtar() throws IOException{
String tarFile = "D:/20120725.tar.gz"
String destFolder = "D:/20120725"
File ss=new File(tarFile)
TarInputStream tis = null
tis = new TarInputStream(new GZIPInputStream(new BufferedInputStream(new FileInputStream(ss))))
TarEntry entry
try{
while((entry = tis.getNextEntry()) != null) {
int count
byte data[] = new byte[204800]
FileOutputStream fos = new FileOutputStream(new File(destFolder + "/" + entry.getName()))
BufferedOutputStream dest = new BufferedOutputStream(fos)
while((count = tis.read(data)) != -1) {
dest.write(data, 0, count)
}
dest.flush()
dest.close()
}
tis.close()
} catch (FileNotFoundException e) {
e.printStackTrace()
} catch (IOException e) {
e.printStackTrace()
}
}