Java圧縮技術の学習

13189 ワード

仕事の必要性のため、いつも手動でオンラインインストールパッケージを打って、便利のために、自分でプログラムを書いてパッケージを助けます.UnixやLinuxを使ったことがある人は、基本的にtarパッケージやgzip圧縮を使ったことがありますが、Windowsで一番使われている圧縮はRARやZip圧縮でしょう
一、        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);

			}

		}

	}