Java圧縮技術の学習
13189 ワード
仕事の必要性のため、いつも手動でオンラインインストールパッケージを打って、便利のために、自分でプログラムを書いてパッケージを助けます.UnixやLinuxを使ったことがある人は、基本的にtarパッケージやgzip圧縮を使ったことがありますが、Windowsで一番使われている圧縮はRARやZip圧縮でしょう
一、 tar梱包、解包
JavaのJDKには元のtarアーカイブクラスはなく、オープンソースのパッケージ:commons-compress-1.0.jarをダウンロードする必要があるので、
最初のステップはjarパッケージをダウンロードし、www.findjar.comで検索してダウンロードできます.
第2歩は工事に導入する.無視
第3歩はソースコードを編纂して、コードを書く前に紹介を使います
次に、パッケージ化されたソースコードを示します.
以下のパッケージ解除のソースコード
二、 gzip圧縮、解凍
gzipは圧縮ディレクトリをサポートしていないことに注意してください.Jdkにはクラスサポート圧縮ファイルが提供されています.デフォルトで.gzファイルを生成
主に対応するJavaクラスは次のとおりです.
ソースコードの圧縮
.gzパッケージのソースコードを解凍
三、 zip圧縮、解凍
Jdkはコード技術サポートを提供し、tarパッケージはzip圧縮と似ている.
Jdkの主なクラスは次のとおりです.
ソースコードの圧縮
ソースコードの解凍
一、 tar梱包、解包
JavaのJDKには元のtarアーカイブクラスはなく、オープンソースのパッケージ:commons-compress-1.0.jarをダウンロードする必要があるので、
最初のステップはjarパッケージをダウンロードし、www.findjar.comで検索してダウンロードできます.
第2歩は工事に導入する.無視
第3歩はソースコードを編纂して、コードを書く前に紹介を使います
//
org.apache.commons.compress.archivers.tar.TarArchiveOutputStream
//
org.apache.commons.compress.archivers.tar.TarArchiveInputStream
//
void org.apache.commons.compress.archivers.tar.TarArchiveOutputStream.putArchiveEntry(ArchiveEntry arg0)
// :
TarArchiveOutputStream.LONGFILE_GNU TarArchiveOutputStream.LONGFILE_ERROR TarArchiveOutputStream.LONGFILE_TRUNCATE
void org.apache.commons.compress.archivers.tar.TarArchiveOutputStream.setLongFileMode(int longFileMode)
//
TarArchiveEntry org.apache.commons.compress.archivers.tar.TarArchiveInputStream.getNextTarEntry() throws IOException
次に、パッケージ化されたソースコードを示します.
/**
* tar
* @param source
* @param dest
*/
public static void tar(File source){
logger.info(" ["+source.getName()+"] tar ");
FileOutputStream out = null;
TarArchiveOutputStream tarOut = null;
String parentPath = source.getParent();
File dest = new File(parentPath + source.getName() + ".tar");
try{
out = new FileOutputStream(dest);
tarOut = new TarArchiveOutputStream(out);
//
tarOut.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU);
tarPack(source, tarOut,"");
tarOut.flush();
tarOut.close();
logger.info(" tar , :["+dest.getName()+"]");
}catch (Exception e) {
logger.error(e.getMessage(),e);
}finally{
try{
if(out != null){
out.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}
try{
if(tarOut != null){
tarOut.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}
}
}
/**
*
* @param source
* @param tarOut
* @param parentPath
*/
public static void tarPack(File source,TarArchiveOutputStream tarOut,String parentPath){
if(source.isDirectory()){
tarDir(source,tarOut,parentPath);
}else if(source.isFile()){
tarFile(source,tarOut,parentPath);
}
}
/**
* ( )
* @param source
* @param tarOut
* @param parentPath
*/
public static void tarFile(File source,TarArchiveOutputStream tarOut,String parentPath){
TarArchiveEntry entry = new TarArchiveEntry(parentPath + source.getName());
BufferedInputStream bis = null;
FileInputStream fis = null;
try {
entry.setSize(source.length());
tarOut.putArchiveEntry(entry);
fis = new FileInputStream(source);
bis = new BufferedInputStream(fis);
int count = -1;
byte []buffer = new byte[1024];
while((count = bis.read(buffer, 0, 1024)) != -1){
tarOut.write(buffer, 0, count);
}
bis.close();
tarOut.closeArchiveEntry();
} catch (IOException e) {
logger.error(e.getMessage(),e);
}finally{
try {
if(bis != null){
bis.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
try {
if(fis != null){
fis.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
/**
*
* @param sourceDir
* @param tarOut
* @param parentPath
*/
public static void tarDir(File sourceDir,TarArchiveOutputStream tarOut,String parentPath){
//
if(sourceDir.listFiles().length < 1){
TarArchiveEntry entry = new TarArchiveEntry(parentPath + sourceDir.getName() + "\\");
try {
tarOut.putArchiveEntry(entry);
tarOut.closeArchiveEntry();
} catch (IOException e) {
logger.error(e.getMessage(),e);
}
}
//
for (File file : sourceDir.listFiles()) {
tarPack(file, tarOut,parentPath + sourceDir.getName() + "\\");
}
}
以下のパッケージ解除のソースコード
/**
*
* @param source tar
*/
public static void untar(File source){
TarArchiveInputStream tarIn = null;
FileInputStream fis = null;
String parentPath = source.getParent();
BufferedOutputStream bos = null;
FileOutputStream fos = null;
try{
fis = new FileInputStream(source);
tarIn = new TarArchiveInputStream(fis);
TarArchiveEntry entry = null;
while((entry = tarIn.getNextTarEntry()) != null){
File file = new File(parentPath + "\\" + entry.getName());
//
if(entry.isDirectory()){
file.mkdirs();
continue;
}
File parentDir = file.getParentFile();
if(!parentDir.exists()){
parentDir.mkdirs();
}
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
int count = -1;
byte []buffer = new byte[1024];
while((count = tarIn.read(buffer, 0, buffer.length)) != -1){
bos.write(buffer, 0, count);
}
bos.flush();
bos.close();
fos.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}finally{
try{
if(fis != null){
fis.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}
try{
if(fos != null){
fos.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}
try{
if(bos != null){
bos.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}
try{
if(tarIn != null){
tarIn.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}
}
}
二、 gzip圧縮、解凍
gzipは圧縮ディレクトリをサポートしていないことに注意してください.Jdkにはクラスサポート圧縮ファイルが提供されています.デフォルトで.gzファイルを生成
主に対応するJavaクラスは次のとおりです.
//Gzip
java.util.zip.GZIPInputStream
//Gzip
java.util.zip.GZIPOutputStream
ソースコードの圧縮
/**
* gzip , .gz
* @param source
*/
public static void gzip(File source){
logger.info(" ["+source.getName()+"] .gz ");
String dir = source.getParent();
File target = new File(dir + "\\" +source.getName() + ".gz");
FileInputStream fis = null;
FileOutputStream fos = null;
GZIPOutputStream gzipOS = null;
try{
fis = new FileInputStream(source);
fos = new FileOutputStream(target);
gzipOS = new GZIPOutputStream(fos);
int count = -1;
byte [] buffer = new byte[1024];
while((count = fis.read(buffer, 0, buffer.length)) != -1){
gzipOS.write(buffer, 0, count);
}
gzipOS.flush();
gzipOS.close();
logger.info(" ["+source.getName()+"] .gz ["+target.getName()+"]");
}catch (Exception e) {
logger.error(e.getMessage(),e);
}finally{
try{
if(fis!=null){
fis.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}
try{
if(fos!=null){
fos.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}
try{
if(gzipOS!=null){
gzipOS.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}
}
}
.gzパッケージのソースコードを解凍
/**
* .gz
* @param source .gz
*/
public static void ungzip(File source){
GZIPInputStream gzipIS = null;
FileInputStream fis = null;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
String fileName = source.getName();
fileName = fileName.substring(0, fileName.lastIndexOf("."));
try{
fis = new FileInputStream(source);
gzipIS = new GZIPInputStream(fis);
File target = new File(source.getParent() + "\\" + fileName);
fos = new FileOutputStream(target);
bos = new BufferedOutputStream(fos);
int count = -1;
byte []buffer = new byte[1024];
while((count = gzipIS.read(buffer, 0, buffer.length)) != -1){
bos.write(buffer, 0, count);
}
bos.flush();
}catch (Exception e) {
logger.error(e.getMessage(),e);
}finally{
try{
if(fis!=null){
fis.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}
try{
if(fos!=null){
fos.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}
try{
if(bos != null){
bos.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}
try{
if(gzipIS!=null){
gzipIS.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}
}
}
三、 zip圧縮、解凍
Jdkはコード技術サポートを提供し、tarパッケージはzip圧縮と似ている.
Jdkの主なクラスは次のとおりです.
java.util.zip.ZipOutputStream
java.util.zip.ZipInputStream
ソースコードの圧縮
/**
* zip
* @param source
*/
public static void zip(File source){
String dir = source.getParent();
File target = new File(dir + "\\" +source.getName() + ".zip");
FileOutputStream fos = null;
ZipOutputStream zipos = null;
try{
fos = new FileOutputStream(target);
zipos = new ZipOutputStream(fos);
zipFile(source, zipos, "");
// , no such file or directory
zipos.close();
}catch (Exception e) {
logger.error(e.getMessage(),e);
}finally{
try {
if(fos != null){
fos.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
try {
if(zipos != null){
zipos.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
/**
*
* @param source
* @param zipos zip
* @param parentPath
*/
public static void zipFile(File source,ZipOutputStream zipos,String parentPath){
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
//
if(source.isDirectory()){
File[]files = source.listFiles();
if(files.length < 1){
ZipEntry entry = new ZipEntry(parentPath + source.getName() + "/");
zipos.putNextEntry(entry);
}
for (File file : files) {
zipFile(file, zipos, parentPath + source.getName() + "/");
}
}else if(source.isFile()){
fis = new FileInputStream(source);
bis = new BufferedInputStream(fis);
ZipEntry entry = new ZipEntry(parentPath + source.getName());
zipos.putNextEntry(entry);
int count = -1;
byte []buffer = new byte[1024];
while((count = bis.read(buffer, 0, buffer.length)) != -1){
zipos.write(buffer, 0, count);
}
fis.close();
bis.close();
}
} catch (IOException e) {
logger.error(e.getMessage(),e);
}finally{
try {
if(bis != null){
bis.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
try {
if(fis != null){
fis.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
ソースコードの解凍
/**
* zip
* @param source .zip
*/
public static void unzip(File source){
ZipInputStream zipIn = null;
FileInputStream fis = null;
String parentPath = source.getParent();
System.out.println(parentPath);
BufferedOutputStream bos = null;
FileOutputStream fos = null;
try{
fis = new FileInputStream(source);
zipIn = new ZipInputStream(fis);
ZipEntry entry = null;
while((entry = zipIn.getNextEntry()) != null){
File file = new File(parentPath + "\\" + entry.getName());
//
if(entry.isDirectory()){
file.mkdirs();
continue;
}
File parentDir = file.getParentFile();
if(!parentDir.exists()){
parentDir.mkdirs();
}
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
int count = -1;
byte []buffer = new byte[1024];
while((count = zipIn.read(buffer, 0, buffer.length)) != -1){
bos.write(buffer, 0, count);
}
bos.flush();
bos.close();
fos.close();
}
zipIn.close();
}catch (Exception e) {
logger.error(e.getMessage(),e);
}finally{
try{
if(fis != null){
fis.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}
try{
if(fos != null){
fos.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}
try{
if(bos != null){
bos.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}
try{
if(zipIn != null){
zipIn.close();
}
}catch (Exception e) {
logger.error(e.getMessage(),e);
}
}
}