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();
}
}