Here is a complete pure Java example using Apache Commons Compress and XZ for Java.
Most code parts are copied from the Apache Commons Compress documentation and a little bit rearranged.
The archive file is processed directly without storing it as a temporary file.
package org.example;
import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ArchiveInputStream;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.compressors.xz.XZCompressorInputStream;
import org.apache.commons.compress.utils.IOUtils;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Files;
public class DecompressionExample {
private static final String INPUT_URL = "https://download.freedict.org/dictionaries/deu-eng/1.9-fd1/freedict-deu-eng-1.9-fd1.dictd.tar.xz";
private static final String TARGET_DIR_NAME = "/home/barnabas/dev/tmp/out";
public static void main( String[] args ) throws MalformedURLException {
File targetDir = new File(TARGET_DIR_NAME);
URL url = new URL(INPUT_URL);
try (
InputStream fi = url.openStream();
InputStream bi = new BufferedInputStream(fi);
InputStream xzi = new XZCompressorInputStream(bi);
ArchiveInputStream i = new TarArchiveInputStream(xzi)
) {
ArchiveEntry entry = null;
while ((entry = i.getNextEntry()) != null) {
if (!i.canReadEntryData(entry)) {
// log something?
continue;
}
File f = fileName(targetDir, entry);
if (entry.isDirectory()) {
if (!f.isDirectory() && !f.mkdirs()) {
throw new IOException("failed to create directory " + f);
}
} else {
File parent = f.getParentFile();
if (!parent.isDirectory() && !parent.mkdirs()) {
throw new IOException("failed to create directory " + parent);
}
try (OutputStream o = Files.newOutputStream(f.toPath())) {
IOUtils.copy(i, o);
}
}
}
} catch(Exception e) {
e.printStackTrace();
}
}
private static File fileName(File targetDir, ArchiveEntry entry) {
return new File(targetDir, entry.getName());
}
}
These are the Maven dependencies:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.22</version>
</dependency>
<dependency>
<groupId>org.tukaani</groupId>
<artifactId>xz</artifactId>
<version>1.9</version>
</dependency>