Newer
Older
adjustgpx-core / src / osm / jp / gpx / utils / TarGz.java
@haya4 haya4 on 18 Aug 2019 2 KB Java11 - AdjustTime2
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();
    }
}