最近的项目需要对一个.gz文件解压,刚好java api提供了GZIPInputStream这样的类,顺便也简单学习了GZIPOutputStream类提供的压缩gz的方法。写了两个函数分别可以实现压缩和解压的方法。实现的原理很简单,以解压为例,首先用字节数组获得gz文件的输入流,再将字节数组的内容写到目标文件的输出流即可。不过目前只能对单个文件进行压缩和解压,多个文件的工作还没有做。欢迎大家讨论方法的正确性。
public static void main(String []args) throws IOException{
File toZipFile = new File(TOZIP_FILE_PATH);
File mediumFile = new File(ZIPPED_FILE_PATH);
File toUnzipFile = new File(TOUNZIP_FILE_PATH);
gzipFile(toZipFile,mediumFile);
ungzipFile(mediumFile,toUnzipFile);
}
public static void ungzipFile(File srcFile,File desFile){
FileInputStream is;
FileOutputStream os;
InputStream gzis;
final int MAX_BYTE = 1024*1000;
int len = 0;
byte [] b = new byte[MAX_BYTE];
try {
is = new FileInputStream(srcFile);
os = new FileOutputStream(desFile);
try {
gzis = new GZIPInputStream(is);
while((len = gzis.read(b))!=-1)
os.write(b,0,len);
os.flush();
gzis.close();
os.close();
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
srcFile.delete();
}
public static void gzipFile(File srcFile,File desFile){
FileInputStream fis;
FileOutputStream fos;
GZIPOutputStream gzos;
final int MAX_BYTE = 1024*1000;
int len = 0;
byte [] b = new byte[MAX_BYTE];
try {
fis = new FileInputStream(srcFile);
fos = new FileOutputStream(desFile);
gzos = new GZIPOutputStream(fos);
while((len = fis.read(b))!=-1)
gzos.write(b,0,len);
gzos.flush();
gzos.close();
fos.close();
fis.close();
} catch (IOException e1) {
e1.printStackTrace();
}