Java에서 tar 파일을 어떻게 추출합니까?
Java에서 tar (또는 tar.gz 또는 tar.bz2) 파일을 어떻게 추출합니까?
참고 : 이 기능은 나중에 다른 답변에 설명 된 대로 별도의 프로젝트 인 Apache Commons Compress를 통해 게시 되었습니다. 이 답변은 오래되었습니다.
tar API를 직접 사용하지는 않았지만 tar와 bzip2는 Ant에서 구현되었습니다. 구현을 빌리거나 Ant를 사용하여 필요한 작업을 수행 할 수 있습니다.
Gzip은 Java SE의 일부입니다 (그리고 Ant 구현이 동일한 모델을 따르는 것 같습니다).
GZIPInputStream
InputStream
장식 자일 뿐입니다 . 예를 들어 a FileInputStream
를 감싸고 GZIPInputStream
다음과 같은 방식으로 사용할 수 있습니다 InputStream
.
InputStream is = new GZIPInputStream(new FileInputStream(file));
(주는 GZIPInputStream 그래서 포장, 자신의 내부 버퍼를 가지고 FileInputStream
A의를 BufferedInputStream
아마 성능이 저하 될 것입니다.)
Apache Commons Compress 라이브러리를 사용하여이를 수행 할 수 있습니다. http://mvnrepository.com/artifact/org.apache.commons/commons-compress/1.2 에서 1.2 버전을 다운로드 할 수 있습니다 .
두 가지 방법이 있습니다. 하나는 파일의 압축을 풀고 다른 하나는 압축을 풉니 다. 따라서 <fileName> tar.gz 파일의 경우 먼저 압축을 풀고 그 후에 압축을 풀어야합니다. tar 아카이브에는 폴더도 포함될 수 있으며,이 경우 로컬 파일 시스템에 생성해야합니다.
즐겨.
/** Untar an input file into an output file.
* The output file is created in the output folder, having the same name
* as the input file, minus the '.tar' extension.
*
* @param inputFile the input .tar file
* @param outputDir the output directory file.
* @throws IOException
* @throws FileNotFoundException
*
* @return The {@link List} of {@link File}s with the untared content.
* @throws ArchiveException
*/
private static List<File> unTar(final File inputFile, final File outputDir) throws FileNotFoundException, IOException, ArchiveException {
LOG.info(String.format("Untaring %s to dir %s.", inputFile.getAbsolutePath(), outputDir.getAbsolutePath()));
final List<File> untaredFiles = new LinkedList<File>();
final InputStream is = new FileInputStream(inputFile);
final TarArchiveInputStream debInputStream = (TarArchiveInputStream) new ArchiveStreamFactory().createArchiveInputStream("tar", is);
TarArchiveEntry entry = null;
while ((entry = (TarArchiveEntry)debInputStream.getNextEntry()) != null) {
final File outputFile = new File(outputDir, entry.getName());
if (entry.isDirectory()) {
LOG.info(String.format("Attempting to write output directory %s.", outputFile.getAbsolutePath()));
if (!outputFile.exists()) {
LOG.info(String.format("Attempting to create output directory %s.", outputFile.getAbsolutePath()));
if (!outputFile.mkdirs()) {
throw new IllegalStateException(String.format("Couldn't create directory %s.", outputFile.getAbsolutePath()));
}
}
} else {
LOG.info(String.format("Creating output file %s.", outputFile.getAbsolutePath()));
final OutputStream outputFileStream = new FileOutputStream(outputFile);
IOUtils.copy(debInputStream, outputFileStream);
outputFileStream.close();
}
untaredFiles.add(outputFile);
}
debInputStream.close();
return untaredFiles;
}
/**
* Ungzip an input file into an output file.
* <p>
* The output file is created in the output folder, having the same name
* as the input file, minus the '.gz' extension.
*
* @param inputFile the input .gz file
* @param outputDir the output directory file.
* @throws IOException
* @throws FileNotFoundException
*
* @return The {@File} with the ungzipped content.
*/
private static File unGzip(final File inputFile, final File outputDir) throws FileNotFoundException, IOException {
LOG.info(String.format("Ungzipping %s to dir %s.", inputFile.getAbsolutePath(), outputDir.getAbsolutePath()));
final File outputFile = new File(outputDir, inputFile.getName().substring(0, inputFile.getName().length() - 3));
final GZIPInputStream in = new GZIPInputStream(new FileInputStream(inputFile));
final FileOutputStream out = new FileOutputStream(outputFile);
IOUtils.copy(in, out);
in.close();
out.close();
return outputFile;
}
Apache Commons VFS 는 tar를 가상 파일 시스템 으로 지원하며 이와 같은 URL을 지원합니다.tar:gz:http://anyhost/dir/mytar.tar.gz!/mytar.tar!/path/in/tar/README.txt
TrueZip or its successor TrueVFS does the same ... it's also available from Maven Central.
Archiver archiver = ArchiverFactory.createArchiver("tar", "gz");
archiver.extract(archiveFile, destDir);
Dependency:
<dependency>
<groupId>org.rauschig</groupId>
<artifactId>jarchivelib</artifactId>
<version>0.5.0</version>
</dependency>
I just tried a bunch of the suggested libs (TrueZip, Apache Compress), but no luck.
Here is an example with Apache Commons VFS:
FileSystemManager fsManager = VFS.getManager();
FileObject archive = fsManager.resolveFile("tgz:file://" + fileName);
// List the children of the archive file
FileObject[] children = archive.getChildren();
System.out.println("Children of " + archive.getName().getURI()+" are ");
for (int i = 0; i < children.length; i++) {
FileObject fo = children[i];
System.out.println(fo.getName().getBaseName());
if (fo.isReadable() && fo.getType() == FileType.FILE
&& fo.getName().getExtension().equals("nxml")) {
FileContent fc = fo.getContent();
InputStream is = fc.getInputStream();
}
}
And the maven dependency:
<dependency>
<groupId>commons-vfs</groupId>
<artifactId>commons-vfs</artifactId>
<version>1.0</version>
</dependency>
In addition to gzip and bzip2, Apache Commons Compress API has also tar support, originally based on ICE Engineering Java Tar Package, which is both API and standalone tool.
What about using this API for tar files, this other one included inside Ant for BZIP2 and the standard one for GZIP?
Here's a version based on this earlier answer by Dan Borza that uses Apache Commons Compress and Java NIO (i.e. Path instead of File). It also does the uncompression and untarring in one stream so there's no intermediate file creation.
public static void unTarGz( Path pathInput, Path pathOutput ) throws IOException {
TarArchiveInputStream tararchiveinputstream =
new TarArchiveInputStream(
new GzipCompressorInputStream(
new BufferedInputStream( Files.newInputStream( pathInput ) ) ) );
ArchiveEntry archiveentry = null;
while( (archiveentry = tararchiveinputstream.getNextEntry()) != null ) {
Path pathEntryOutput = pathOutput.resolve( archiveentry.getName() );
if( archiveentry.isDirectory() ) {
if( !Files.exists( pathEntryOutput ) )
Files.createDirectory( pathEntryOutput );
}
else
Files.copy( tararchiveinputstream, pathEntryOutput );
}
tararchiveinputstream.close();
}
참고URL : https://stackoverflow.com/questions/315618/how-do-i-extract-a-tar-file-in-java
'Programing' 카테고리의 다른 글
CSS에서 1div가있는 겹치는 원 (0) | 2020.12.04 |
---|---|
“git checkout-”. (0) | 2020.12.04 |
PHP 페이지를 이미지로 반환 (0) | 2020.12.04 |
명령 줄에서 Android 애플리케이션을 시작하는 방법은 무엇입니까? (0) | 2020.12.04 |
argparse를 사용하는 Python의 선택적 stdin (0) | 2020.12.04 |