[Java]apache commons 를 이용한 tar압축 풀기

2023. 1. 19. 19:08프로그래밍

728x90

 

 

How to untar a TAR file using Apache Commons

I'm using the Apache Commons 1.4.1 library to compress and uncompress ".tar.gz" files. I'm having trouble with the last bit -- converting a TarArchiveInputStream into a FileOutputStream. Oddly en...

stackoverflow.com

내용은 다음과 같습니다.

 

1. 질문

Apache Commons 1.4.1 라이브러리를 사용하여 ".tar.gz" 파일을 압축 및 압축 해제 중입니다.

TarArchiveInputStream을 FileOutputStream으로 변환하는 마지막 단계에서 문제가 발생합니다.

이상하게도 다음 줄에서 깨집니다:

FileOutputStream fout = new FileOutputStream(destPath);
 

destPath는 실제 경로가 있는 파일 경로 입니다:

C:\Documents and Settings\Administrator\My Documents\JavaWorkspace\BackupUtility\untarred\Test\subdir\testinsub.txt

 

에러는:

Exception in thread "main" java.io.IOException: The system cannot find the path specified
 

이게 어떻게 이런 일이 일어날까요? 그리고 경로를 찾을 수 없는 이유는 무엇일까요?

아래에 전체 메서드를 첨부 했습니다(대부분 여기에 언급 함).

 

채택답변:

여기 몇 가지 일반적인 사항을 적어 볼께요

 

첫째, 알맞은 파일 클래스의 생성자를 골라야 합니다. 생성하려는 File의 이름을 정의하고 부모 File을 제공할 수 있는 완벽하게 맞아 떨어지는 생성자를 선택 하세요.

 

둘째, Windows의 경로에서 빈 공간이 어떻게 처리되는지 잘 모르겠습니다.

빈공간 즉 스페이스가 문제의 원인일 수 있을 것입니다.

 

위에서 언급한 생성자를 사용해 보고 차이가 있는지 확인하십시오:

File destPath = new File(dest, tarEntry.getName()); 
 

위 dest 는 파일이 확실하고, 특정 위치에 존재하며 사용자가 액세스할 수 있다고 가정합니다.

 

셋째, File 객체로 어떤 작업을 하기 전에 파일 객체가 존재하는지, 액세스 가능한지 확인해야 합니다.

그러면 정말로 문제를 정확히 파악하는 데 도움이 될 것입니다.

 

참고.

 

[Java]파일 압축 해제 - tar.gz

아파치 commons.compression 라이브러리를 사용하여 tar.gz으로 묶기 1. commons compression 라이브러리 ...

blog.naver.com

 

채택을 안 되었지만, 내 코드 입니다. 스택오버플로우에서 해당 글의 답변의 내가 젤 많이 받았어요~~^^;;

 

 

How to untar a TAR file using Apache Commons

I'm using the Apache Commons 1.4.1 library to compress and uncompress ".tar.gz" files. I'm having trouble with the last bit -- converting a TarArchiveInputStream into a FileOutputStream. Oddly en...

stackoverflow.com

 

public static void uncompressTarGZ(File tarFile, File dest) throws IOException {
    dest.mkdir();
    TarArchiveInputStream tarIn = null;

    tarIn = new TarArchiveInputStream(
                new GzipCompressorInputStream(
                    new BufferedInputStream(
                        new FileInputStream(
                            tarFile
                        )
                    )
                )
            );

    TarArchiveEntry tarEntry = tarIn.getNextTarEntry();
    // tarIn is a TarArchiveInputStream
    while (tarEntry != null) {// create a file with the same name as the tarEntry
        File destPath = new File(dest, tarEntry.getName());
        System.out.println("working: " + destPath.getCanonicalPath());
        if (tarEntry.isDirectory()) {
            destPath.mkdirs();
        } else {
            destPath.createNewFile();
            //byte [] btoRead = new byte[(int)tarEntry.getSize()];
            byte [] btoRead = new byte[1024];
            //FileInputStream fin 
            //  = new FileInputStream(destPath.getCanonicalPath());
            BufferedOutputStream bout = 
                new BufferedOutputStream(new FileOutputStream(destPath));
            int len = 0;

            while((len = tarIn.read(btoRead)) != -1)
            {
                bout.write(btoRead,0,len);
            }

            bout.close();
            btoRead = null;

        }
        tarEntry = tarIn.getNextTarEntry();
    }
    tarIn.close();
}
 
 

 

여담으로 압축하기는 다음과 같이 진행 하면 됩니다.

package testCompression;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
import org.apache.commons.compress.utils.IOUtils;

public class TarFileTest {
	public void doMakeTargz(String dirToCompress, String gzFileName) throws FileNotFoundException, IOException {
		TarArchiveOutputStream tOut = null;

		try {
			System.out.println(new File(".").getAbsolutePath());
			
			tOut = new TarArchiveOutputStream(new GzipCompressorOutputStream(
					new BufferedOutputStream(new FileOutputStream(new File(gzFileName)))));
			addFileToTarGz(tOut, dirToCompress, "");
		} finally {
			tOut.finish();
			tOut.close();

		}
	}

	private void addFileToTarGz(TarArchiveOutputStream tOut, String path, String base) throws IOException {
		File f = new File(path);
		System.out.println(f.exists());
		String entryName = base + f.getName();
		TarArchiveEntry tarEntry = new TarArchiveEntry(f, entryName);
		tOut.putArchiveEntry(tarEntry);

		if (f.isFile()) {
			IOUtils.copy(new FileInputStream(f), tOut);
			tOut.closeArchiveEntry();
		} else {
			tOut.closeArchiveEntry();
			File[] children = f.listFiles();
			if (children != null) {
				for (File child : children) {
					System.out.println(child.getName());
					addFileToTarGz(tOut, child.getAbsolutePath(), entryName + "/");
				}
			}
		}
	}
}

 

위 코드를 이용하기 위한 메인 코드는 다음과 같습니다.

public static void main(String[] args)
{
    TarFileTest tarTest = new TarFileTest();

    String dirToCompress = "D:/DEV/DATA/haar-car";
    String gzFileName = "archive.tar.gz";

    try {
        tarTest.doMakeTargz(dirToCompress, gzFileName);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

 

dirToCompress 폴더에 있는 모든 파일 및 폴더를 gzFileName 의 이름으로 옮겨 줄 수 있습니다.

tar파일로 압축 한 후 확인하기

이상.

 

728x90