IOストリームのZipInputStreamとZipOutputStreamの認識とよく使われる


ZipInputStreamとZipOutputStreamの定義
  • 圧縮ストリームは、zipやrarのような圧縮ファイルに日常的に使用され、日常的なファイルの転送と使用をより便利にします.もちろんjavaでは、gzip、zip、rarのようなファイルを圧縮および解凍するための対応する入出力ストリームも提供されています.
  • ZipInputStream「圧縮ファイル入力ストリーム」は、ディスク上の圧縮ファイル
  • を読み取るために使用される.
  • ZipOutputStream「圧縮ファイル出力ストリーム」は、プログラム内の圧縮ストリームをディスクに書き出すために使用されます.通常、ZipFile ZipInputStream/ZipOutputStream ZipEntryレベルFileを使用して解凍操作を完了する必要があります.
  • 他の類似流
  • JAVA IOでは、ZIP圧縮フォーマットの入出力のみならず、JARおよびGZIPファイルフォーマットの圧縮:
  • も実現できる.
  • JAR圧縮のサポートクラスはjava.util.jarパッケージに保存されています.よく使われるクラスは以下のとおりです.
  • JAR圧縮出力ストリーム:JarOutputStream
  • JAR圧縮入力ストリーム:JarInputStream
  • JARファイル:JARFile
  • JARエンティティ:JAREntry
  • GZIPはUNIXシステムのファイル圧縮に用いられ、Linuxではよく*.gzのファイルが用いられる.GZIP形式であり、GZIP圧縮のサポートクラスはjava.util.zipパッケージに保存され、よく使われるクラスは以下の通りである.
  • GZIP圧縮出力ストリーム:GZIPOutputStream
  • GZIP圧縮入力ストリーム:GZIPInputStream
  • 使用例
  • 圧縮
  •     //     1
        public static void compress(String srcPath, String destPath,boolean dirFlag) throws Exception {
            compress(new File(srcPath), new File(destPath), dirFlag);
        }
    
        //     2
        public static void compress(String srcPath, String destPath) throws Exception {
            compress(new File(srcPath), new File(destPath), DEFAULT_DIR);
        }
    
        //     3
        public static void compress(File srcFile, File destFile, boolean dirFlag) throws Exception {
            compress(srcFile, new ZipOutputStream(new FileOutputStream(destFile)), dirFlag);
        }
    
        public static void compress(File srcFile, ZipOutputStream zos, boolean dirFlag) throws Exception {
            //            
            //      
            //                     
            if (srcFile.isDirectory()) {
                if (dirFlag) {
                    doCompress(zos, srcFile, srcFile.getName() + File.separator);
                } else {
                    doCompress(zos, srcFile, "");
                }
            } else {
                doCompress(zos, srcFile, "");
            }
            zos.close();
        }
    
        public static void doCompress(ZipOutputStream zos, File file, String baseDir) throws Exception {
            if (file.isDirectory()) {
                //     ,         
                File[] files = file.listFiles();
                for (int i = 0; i < files.length; i++) {
                    doCompress(zos, files[i], baseDir);
                }
            } else {
                //          
                byte[] buff = new byte[DEFAULT_BUFF_SIZE];
                InputStream in = new FileInputStream(file);
                zos.putNextEntry(new ZipEntry(baseDir + File.separator + file.getName()));
                int len;
                while ((len = in.read(buff,0 ,DEFAULT_BUFF_SIZE)) != -1) {
                    zos.write(buff, 0, len);
                }
                in.close();
            }
        }
  • 解凍
  • /**
         * Default buff byte size
         *
         */
        private static final int DEFAULT_BUFF_SIZE = 1024;
    
        /**
         * Default basedir value
         *
         */
        private static final boolean DEFAULT_DIR = false;
    
        //     1
        public static void decompress(String srcPath) throws Exception {
            decompress(new File(srcPath));
        }
    
        //     2
        public static void decompress(File srcFile) throws Exception {
            File baseFile = srcFile.getParentFile();
            decompress(srcFile, baseFile);
        }
    
        //     3
        public static void decompress(String srcPath, String destPath) throws Exception {
            decompress(new File(srcPath), new File(destPath));
        }
    
        //       
        public static void decompress(File srcFile, File destFile) throws Exception {
            CheckedInputStream cis = new CheckedInputStream(new FileInputStream(srcFile), new CRC32());
            ZipInputStream zis = new ZipInputStream(cis);
            //     
            doDecompress(destFile, zis);
            zis.close();
        }
    
        private static void doDecompress(File destFile, ZipInputStream zis) throws Exception {
            ZipEntry zipEntry = null;
            while ((zipEntry = zis.getNextEntry()) != null) {
                String dir = destFile.getPath() + File.separator + zipEntry.getName();
                File dirFile = new File(dir);
                //          ,          
                fileProber(dirFile);
                if (zipEntry.isDirectory()) {
                    //   zipEntry   ,     
                    dirFile.mkdirs();
                } else {
                    //               zipEntry  
                    doDecompressFile(dirFile, zis);
                }
                zis.closeEntry();
            }
        }
    
        //             
        private static void doDecompressFile(File destFile, ZipInputStream zis) throws Exception {
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
            int len;
            byte[] buff = new byte[DEFAULT_BUFF_SIZE];
            while ((len = zis.read(buff, 0 ,DEFAULT_BUFF_SIZE)) != -1) {
                bos.write(buff, 0, len);
            }
            bos.close();
        }
    
        /**
         *     
         *
         * When the parent file not exist.Create it.
         *
         * @param dirFile
         * @throws Exception
         */
        public static void fileProber(File dirFile) throws Exception {
            File parentFile = dirFile.getParentFile();
            if (!parentFile.exists()) {
                fileProber(parentFile);
                parentFile.mkdirs();
            }
        }
  • ツールクラス
  • /**
     * Copyright © 2018, LeonKeh
     * 

    * All Rights Reserved. */

    package cn.cherry.se.l_io_zipoutputinputstream; import java.io.*; import java.util.zip.*; /** * ZIP * * @author Leon * @version 2018/6/6 23:07 */ public class ZipUtils { /** * Default buff byte size * */ private static final int DEFAULT_BUFF_SIZE = 1024; /** * Default basedir value * */ private static final boolean DEFAULT_DIR = false; public static void decompress(String srcPath) throws Exception { decompress(new File(srcPath)); } public static void decompress(File srcFile) throws Exception { File baseFile = srcFile.getParentFile(); decompress(srcFile, baseFile); } public static void decompress(String srcPath, String destPath) throws Exception { decompress(new File(srcPath), new File(destPath)); } public static void decompress(File srcFile, File destFile) throws Exception { CheckedInputStream cis = new CheckedInputStream(new FileInputStream(srcFile), new CRC32()); ZipInputStream zis = new ZipInputStream(cis); doDecompress(destFile, zis); zis.close(); } private static void doDecompress(File destFile, ZipInputStream zis) throws Exception { ZipEntry zipEntry = null; while ((zipEntry = zis.getNextEntry()) != null) { String dir = destFile.getPath() + File.separator + zipEntry.getName(); File dirFile = new File(dir); fileProber(dirFile); if (zipEntry.isDirectory()) { dirFile.mkdirs(); } else { doDecompressFile(dirFile, zis); } zis.closeEntry(); } } private static void doDecompressFile(File destFile, ZipInputStream zis) throws Exception { BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile)); int len; byte[] buff = new byte[DEFAULT_BUFF_SIZE]; while ((len = zis.read(buff, 0 ,DEFAULT_BUFF_SIZE)) != -1) { bos.write(buff, 0, len); } bos.close(); } /** * * * When the parent file not exist.Create it. * * @param dirFile * @throws Exception */ public static void fileProber(File dirFile) throws Exception { File parentFile = dirFile.getParentFile(); if (!parentFile.exists()) { fileProber(parentFile); parentFile.mkdirs(); } } public static void compress(String srcPath, String destPath,boolean dirFlag) throws Exception { compress(new File(srcPath), new File(destPath), dirFlag); } public static void compress(String srcPath, String destPath) throws Exception { compress(new File(srcPath), new File(destPath), DEFAULT_DIR); } public static void compress(File srcFile, File destFile, boolean dirFlag) throws Exception { compress(srcFile, new ZipOutputStream(new FileOutputStream(destFile)), dirFlag); } public static void compress(File srcFile, ZipOutputStream zos, boolean dirFlag) throws Exception { if (srcFile.isDirectory()) { if (dirFlag) { doCompress(zos, srcFile, srcFile.getName() + File.separator); } else { doCompress(zos, srcFile, ""); } } else { doCompress(zos, srcFile, ""); } zos.close(); } public static void doCompress(ZipOutputStream zos, File file, String baseDir) throws Exception { if (file.isDirectory()) { File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { doCompress(zos, files[i], baseDir); } } else { byte[] buff = new byte[DEFAULT_BUFF_SIZE]; InputStream in = new FileInputStream(file); zos.putNextEntry(new ZipEntry(baseDir + File.separator + file.getName())); int len; while ((len = in.read(buff,0 ,DEFAULT_BUFF_SIZE)) != -1) { zos.write(buff, 0, len); } in.close(); } } }
    まとめ
  • 圧縮ファイルの各特定の圧縮エンティティはJavaでZipEntryで表され、各圧縮ファイルには複数のZipEntry
  • が含まれる可能性が高い.
  • 他の2つのgzipはrar圧縮ファイルと同様に動作し、ここでは
  • を省略する.
  • 圧縮ストリームのソースと目的は必ずしもディスクではなく、ネットワークとメモリの
  • である可能性が高い.
  • ZipFileは圧縮ファイル抽象
  • を表す.
  • の具体的なプロジェクトの開発はApacheのツールパッケージとネット上のいくつかのサードパーティjarツールを使用することができますが、手書きはjavaストリームの理解と認識をさらに深める
  • です.