package osm.jp.gpx.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; /** * 「*.tar.gz」を解凍する。 * ファイル更新日時をオリジナルと同じにします。 * Apache Commons Compressライブラリ * commons-compress-1.14.jar */ public abstract class TarGz { public static void main(String[] args) throws IOException { File baseDir = new File("testdata/cameradata"); File tazFile = new File("testdata", "Sony20170518.tar.gz"); TarGz.uncompress(tazFile, baseDir); } /** * *.tar.gz解凍 * ファイル更新日時をオリジナルと同じにします。 * @param tazFile 解凍する*.tar.gzファイル * @param dest 解凍先フォルダ * @throws IOException */ public static void uncompress(File tazFile, File dest) throws IOException { dest.mkdir(); TarArchiveInputStream tarIn = null; tarIn = new TarArchiveInputStream(new GzipCompressorInputStream(new BufferedInputStream(new FileInputStream(tazFile)))); TarArchiveEntry tarEntry = tarIn.getNextTarEntry(); while (tarEntry != null) { File destPath = new File(dest, tarEntry.getName()); System.out.println("uncompress: " + destPath.getCanonicalPath()); if (tarEntry.isDirectory()) { destPath.mkdirs(); } else { File dir = new File(destPath.getParent()); if (!dir.exists()) { dir.mkdirs(); } destPath.createNewFile(); byte[] btoRead = new byte[1024]; try (BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(destPath))) { int len = 0; while ((len = tarIn.read(btoRead)) != -1) { bout.write(btoRead, 0, len); } } destPath.setLastModified(tarEntry.getLastModifiedDate().getTime()); btoRead = null; } tarEntry = tarIn.getNextTarEntry(); } tarIn.close(); } }