내용은 다음과 같습니다.
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 객체로 어떤 작업을 하기 전에 파일 객체가 존재하는지, 액세스 가능한지 확인해야 합니다.
그러면 정말로 문제를 정확히 파악하는 데 도움이 될 것입니다.
참고.
채택을 안 되었지만, 내 코드 입니다. 스택오버플로우에서 해당 글의 답변의 내가 젤 많이 받았어요~~^^;;
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 의 이름으로 옮겨 줄 수 있습니다.
이상.
'프로그래밍' 카테고리의 다른 글
파이썬 사용해보기-1 (0) | 2023.01.23 |
---|---|
[C] iconv API 사용하기 (0) | 2023.01.20 |
[자바] apache-commons-net FtpClient 래퍼 및 파일 다운로드 (0) | 2023.01.18 |
[Java] JTable, JscrollPane을 사용한 스크롤 바 활성화 (0) | 2023.01.16 |
프로그래밍 씨,씨,씨 - 함수, union (0) | 2023.01.11 |