Apache Commons Archivers 및 Compressor를 사용하여 Java에서 프로그래밍 방식으로 .zip 또는 .tar를 만드는 방법
게시 됨: 2016-03-08Apache Foundation은 기본적으로 우리가 사용할 수 있는 많은 유틸리티와 함께 제공됩니다. 대부분의 경우 우리는 프로덕션 환경에서 사용하기 위해 존재하는 유틸리티를 알지 못합니다.
이 튜토리얼에서는 Java에서 프로그래밍 방식으로 파일이나 디렉토리를 압축할 수 있는 유틸리티 중 하나를 살펴봅니다. 즉, 간단한 아카이브 유틸리티입니다.
이 유틸리티가 필요한 이유는 무엇입니까?
언젠가 Spring MVC 아키텍처를 사용하여 파일을 업로드하는 방법에 대한 기사를 작성했습니다. 매우 큰 파일이 있고 netapp 또는 filer 등과 같은 일부 파일 시스템에서 다른 사용자 파일을 호스팅하는 경우 업로드하기 전에 파일을 압축할 수 있습니다. 동일한 목적을 달성하기 위해 아래 코드를 애플리케이션에 결합할 수 있습니다.
더 나은 이해를 위해 먼저 결과를 확인해 보겠습니다.
전에:
후에:
시작하자:
-
CrunchifyCompressArchivesUtility.java
클래스 생성 - 프로젝트에 아래 maven 종속성을 추가하십시오.
- maven 프로젝트가 없다면 다음 단계를 따르십시오.
1 2 3 4 5 |
< dependency > < groupId > org . apache . commons < / groupId > < artifactId > commons - compress < / artifactId > < version > 1.9 < / version > < / dependency > |
- Apache Commons
compress archivers
유틸리티를 사용할 것입니다. -
TarArchiveEntry
클래스는 Tar 아카이브의 항목을 나타냅니다. 항목의 헤더와 항목의 파일로 구성됩니다. 항목은 사용 방법에 따라 세 가지 방법 중 하나로 인스턴스화할 수 있습니다. -
TarArchiveOutputStream
클래스는 UNIX tar 아카이브를 OutputStream으로 작성합니다. - 먼저 파일만 보관합니다.
- 또한 동일한 프로그램에서 디렉토리를 아카이브합니다.
- 파일과 디렉토리를
.zip
파일로 변환할 것입니다..tar
를 원하면 아래 코드를 변경하십시오. - 아래 코드에서 경로를 변경하십시오.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
package com . crunchify . tutorials ; import java . io . BufferedInputStream ; import java . io . File ; import java . io . FileInputStream ; import java . io . FileOutputStream ; import org . apache . commons . compress . archivers . tar . TarArchiveEntry ; import org . apache . commons . compress . archivers . tar . TarArchiveOutputStream ; /** * @author Crunchify.com * */ public class CrunchifyCompressArchivesUtility { private static final String CRUNCHIFY_BASEDIR = "" ; // Default output path private static final String CRUNCHIFY_PATH = "/Users/<username>/Desktop/" ; // .zip or .tar as per need private static final String FILE_EXTENSION = ".zip" ; public static void main ( String [ ] args ) { try { // Archive File crunchfyArchive ( "/Users/appshah/Desktop/crunchifyTarFile.txt" ) ; log ( "Archive a file task completed...\n" ) ; // Archive Directory crunchfyArchive ( "/Users/appshah/Desktop/crunchifyTarDirectory" ) ; log ( "Archive a Directory task completed..." ) ; } catch ( Exception e ) { log ( e . getStackTrace ( ) . toString ( ) ) ; } } public static void crunchfyArchive ( String srcPath ) throws Exception { File crunchifySourceFile = new File ( srcPath ) ; // Returns the name of the file or directory denoted by this abstract pathname String crunchifyFileName = crunchifySourceFile . getName ( ) ; // Returns the pathname string of this abstract pathname's parent String crunchifyBaseFileNamePath = crunchifySourceFile . getParent ( ) ; String destPath = crunchifyBaseFileNamePath + File . separator + crunchifyFileName + FILE_EXTENSION ; log ( "Archived Location: " + destPath ) ; TarArchiveOutputStream outputStream = new TarArchiveOutputStream ( new FileOutputStream ( new File ( destPath ) ) ) ; crunchfyArchive ( crunchifySourceFile , outputStream , CRUNCHIFY_BASEDIR ) ; // Flushes this output stream and forces any buffered output bytes to be written out outputStream . flush ( ) ; // Closes the underlying OutputStream outputStream . close ( ) ; } private static void crunchfyArchive ( File crunchifySourceFile , TarArchiveOutputStream outputStream , String crunchifyBasePath ) throws Exception { if ( crunchifySourceFile . isDirectory ( ) ) { // Archive Directory archiveCrunchifyDirectory ( crunchifySourceFile , outputStream , crunchifyBasePath ) ; } else { // Archive File archiveCrunchifyFile ( crunchifySourceFile , outputStream , crunchifyBasePath ) ; } } private static void archiveCrunchifyDirectory ( File crunchifyDirectory , TarArchiveOutputStream outputStream , String crunchifyBasePath ) throws Exception { // Returns an array of abstract pathnames denoting the files in the directory denoted by this abstract pathname File [ ] crunchifyFiles = crunchifyDirectory . listFiles ( ) ; if ( crunchifyFiles ! = null ) { if ( crunchifyFiles . length < 1 ) { // Construct an entry with only a name. This allows the programmer to construct the entry's header "by hand". File // is set to null TarArchiveEntry entry = new TarArchiveEntry ( crunchifyBasePath + crunchifyDirectory . getName ( ) + CRUNCHIFY_PATH ) ; // Put an entry on the output stream outputStream . putArchiveEntry ( entry ) ; // Close an entry. This method MUST be called for all file entries that contain data outputStream . closeArchiveEntry ( ) ; } // Repeat for all files for ( File crunchifyFile : crunchifyFiles ) { crunchfyArchive ( crunchifyFile , outputStream , crunchifyBasePath + crunchifyDirectory . getName ( ) + CRUNCHIFY_PATH ) ; } } } private static void archiveCrunchifyFile ( File crunchifyFile , TarArchiveOutputStream outputStream , String crunchifyDirectory ) throws Exception { TarArchiveEntry crunchifyEntry = new TarArchiveEntry ( crunchifyDirectory + crunchifyFile . getName ( ) ) ; // Set this entry's file size crunchifyEntry . setSize ( crunchifyFile . length ( ) ) ; outputStream . putArchiveEntry ( crunchifyEntry ) ; BufferedInputStream inputStream = new BufferedInputStream ( new FileInputStream ( crunchifyFile ) ) ; int counter ; // 512: buffer size byte byteData [ ] = new byte [ 512 ] ; while ( ( counter = inputStream . read ( byteData , 0 , 512 ) ) ! = - 1 ) { outputStream . write ( byteData , 0 , counter ) ; } inputStream . close ( ) ; outputStream . closeArchiveEntry ( ) ; } // Crunchify's favorite log utility private static void log ( String string ) { System . out . println ( string ) ; } } |
산출

1 2 3 4 5 |
Archived Location: /Users/<username>/Desktop/crunchifyTarFile.txt.zip Archive a file task completed... Archived Location: /Users/<username>/Desktop/crunchifyTarDirectory.zip Archive a Directory task completed... |