Java I / Oストリーム-ZIP圧縮入出力ストリーム

ZIP圧縮入出力ストリーム

ZIP圧縮管理ファイルは、非常に一般的なファイル圧縮形式です。ZIP圧縮のストレージスペースを節約し、I / Oストリームを実装できます。組み込みのJavaクラスであるZipOutputStreamおよびZipInputStreamに非常に便利な関連クラスを提供します。ファイルの圧縮/解凍を実現します。圧縮か圧縮解除かに関係なく、クラスが必要です。ZipEntryクラスは、圧縮ファイルまたは圧縮解除ファイルのエントリを作成します。

圧縮ファイル

ZipOutputStreamクラスオブジェクトを使用すると、ファイルを.zipファイルに圧縮できます。ファイルを圧縮するプロセス
ここに画像の説明を挿入
は、ZipOutputStreamクラスの一般的なメソッドです

方法 説明
putNextEntry(ZipEntry e) 新しいZipEntryの書き込みを開始し、ストリーム内の位置をentryが指すデータの先頭に移動します
write(byte [] b、intオフ、int len) バイト配列を現在のZIPエントリデータに書き込む
finish() 連携するOutputStreamを閉じずに、ZIP入力ストリームのコンテンツの書き込みを終了します。
setComment(文字列コメント) このZIPファイルのコメントテキストを設定できます

コードは以下のように表示されます:

public class Study2 {
    
    

	public void zip() {
    
    
		File f1 = new File("C:\\Users\\逢青\\Desktop\\123");// 压缩的源文件
		File f2 = new File("C:\\Users\\逢青\\Desktop\\321.zip");// 压缩包位置

		try (FileOutputStream fos = new FileOutputStream(f2); ZipOutputStream zos = new ZipOutputStream(fos)) {
    
    
			if (f1.isDirectory()) {
    
    // 判断源文件是否为文件夹
				for (File f : f1.listFiles()) {
    
    // 遍历文件夹中的文件
					addEntry(zos, "", f);//调用创建方法的条目,为遍历的文件创建条目
				}
			} else {
    
    
				addEntry(zos, "", f1);//调用创建方法的条目,为文件创建条目
			}

		} catch (FileNotFoundException e) {
    
    
			e.printStackTrace();
		} catch (IOException e) {
    
    
			e.printStackTrace();
		}
	}

	/**
	 * 
	 * @param zos-压缩流
	 * @param path-文件在压缩包中的路径
	 * @param f1-压缩的文件
	 */
	public void addEntry(ZipOutputStream zos, String path, File f1) {
    
    // 创建条目的方法
		if (f1.isDirectory()) {
    
    // 判断文件是否为文件夹
			for (File file : f1.listFiles()) {
    
    // 遍历文件夹
				addEntry(zos, path + f1.getName() + File.separator, file);// 为文件夹下的文件创建条目
			}
		} else {
    
    
			byte b[] = new byte[1024];// 创建缓冲区
			try (FileInputStream fis = new FileInputStream(f1)) {
    
    
				int i = -1;
				zos.putNextEntry(new ZipEntry(path + f1.getName()));// 在压缩包中添加新条目
				//将文件写入压缩包
				while ((i = fis.read(b)) != -1) {
    
    
					zos.write(b,0,i);
					zos.flush();//刷新
				}
				zos.closeEntry();//关闭条目
			} catch (FileNotFoundException e) {
    
    
				e.printStackTrace();
			} catch (IOException e) {
    
    
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
    
    
		Study2 s = new Study2();
		s.zip();
	}
}

ファイルとフォルダは異なりますが、圧縮ファイルにフォルダがある場合は、このフォルダをトラバースして、フォルダ内のファイルのエントリを追加する必要があります。ファイルの場合は、直接エントリを追加できます。

ファイルを解凍する

ZipInputStreamクラスは、圧縮エントリと非圧縮エントリを含むZIP圧縮形式でファイルを読み取ることができます。
ファイルの解凍プロセス
ここに画像の説明を挿入
。ZipInputStreamクラスの一般的なメソッド

方法 説明
read(byte [] b、intオフ、int len) ターゲットb配列のオフセット位置を読み取り、長さはlenバイト
利用可能() 現在のエントリで指定されたデータが読み取られたかどうかを確認します。読んだら0を返し、読んでいなければ1を返す
closeEntry() 現在のZIPエントリを閉じ、ストリームを見つけて次のエントリを読み取ります
skip(long n) 現在のZIPエントリで指定されたバイト数をスキップします
getNextEntry() 次のZipEntryを読み取り、ストリーム内の位置をエントリが指すデータの先頭に移動します
createZipEntry(文字列名) 指定した名前パラメーターで新しいZipEntryオブジェクトを作成します

コードは以下のように表示されます:

public class Study {
    
    
	
	static void decompression() {
    
    
		File f1 = new File("C:\\Users\\逢青\\Desktop\\123");//目标文件夹
		File f2 = new File("C:\\Users\\逢青\\Desktop\\321.zip");//解压的源文件
		byte b[] = new byte[1024];//缓冲区
		ZipEntry zn = null;
		
		try(FileInputStream fis = new FileInputStream(f2);ZipInputStream zis = new ZipInputStream(fis)) {
    
    
			while(true) {
    
    
				zn = zis.getNextEntry();//获取条目
				if(zn == null) {
    
    //判断是否为空,空则结束
					break;
				}
				if(zn.isDirectory()) {
    
    //判断是否为文件夹,是则跳过
					continue;
				}
				
				File f = new File(f1,zn.getName());
				if(!f.getParentFile().exists()) {
    
    //判断目标文件夹是否存在
					f.getParentFile().mkdirs();//创建目标文件夹
				}
				
				int i = -1;
				FileOutputStream fos = new FileOutputStream(f);
				while((i = zis.read(b)) != -1) {
    
    
					fos.write(b, 0, i);
					fos.flush();
				}
				fos.close();
				zis.closeEntry();
			}
		} catch (FileNotFoundException e) {
    
    
			e.printStackTrace();
		} catch (IOException e) {
    
    
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
    
    

		decompression();
	}
}

おすすめ

転載: blog.csdn.net/javanofa/article/details/104592206