Java : DeflaterInputStream (ZIP) - API使用例
DeflaterInputStream (Java SE 19 & JDK 19) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。
概要
Deflate は ZIP でも使われている圧縮形式です。
DeflaterInputStream クラスを使うと、deflate 圧縮形式でデータを読み込めます。
// --------
// 圧縮
final var buf = "aaaaaaaaaa".getBytes();
try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
final var compressed = dis.readAllBytes();
// [120, -100, 75, 76, -124, 1, 0, 20, -31, 3, -53]
System.out.println(Arrays.toString(compressed));
// --------
// 解凍
try (final var iis = new InflaterInputStream(new ByteArrayInputStream(compressed))) {
final var uncompressed = iis.readAllBytes();
// [97, 97, 97, 97, 97, 97, 97, 97, 97, 97]
System.out.println(Arrays.toString(uncompressed));
// aaaaaaaaaa
System.out.println(new String(uncompressed));
}
}
フィールド
protected final byte[] buf
protectedです。
独自にサブクラスを作ることは少ないと思いますので、コード例は割愛します。
protected final Deflater def
protectedです。
独自にサブクラスを作ることは少ないと思いますので、コード例は割愛します。
FilterInputStreamで宣言されたフィールド
in
「Java API 使用例 : FilterInputStream」をご参照ください。
コンストラクタ
DeflaterInputStream (InputStream in)
final var buf = "aaaaaaaaaaaaaa".getBytes();
// [97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97]
System.out.println(Arrays.toString(buf));
try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
final var compressed = dis.readAllBytes();
// [120, -100, 75, 76, 68, 6, 0, 39, -41, 5, 79]
System.out.println(Arrays.toString(compressed));
}
DeflaterInputStream (InputStream in, Deflater defl)
final var buf = "aaaaaaaaaaaaaa".getBytes();
// [97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97]
System.out.println(Arrays.toString(buf));
try (final var dis = new DeflaterInputStream(
new ByteArrayInputStream(buf), new Deflater(Deflater.BEST_COMPRESSION))) {
final var compressed = dis.readAllBytes();
// [120, -38, 75, 76, 68, 6, 0, 39, -41, 5, 79]
System.out.println(Arrays.toString(compressed));
}
DeflaterInputStream (InputStream in, Deflater defl, int bufLen)
in, defl パラメータについては DeflaterInputStream(InputStream in, Deflater defl) の使用例をご参照ください。
class MyInputStream extends DeflaterInputStream {
public MyInputStream(InputStream in) {
super(in, new Deflater());
}
public MyInputStream(InputStream in, int bufLen) {
super(in, new Deflater(), bufLen);
}
int getSize() {
return buf.length;
}
}
try (final var is = new MyInputStream(new ByteArrayInputStream(new byte[0]))) {
System.out.println(is.getSize()); // 512
}
try (final var is = new MyInputStream(new ByteArrayInputStream(new byte[0]), 1024)) {
System.out.println(is.getSize()); // 1024
}
メソッド
int available ()
final var buf = "aaaaaaaaaaaaaa".getBytes();
// [97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97]
System.out.println(Arrays.toString(buf));
try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
System.out.println(dis.available()); // 1
System.out.println(dis.read()); // 120
System.out.println(dis.available()); // 1
System.out.println(dis.read()); // 156
System.out.println(dis.available()); // 1
System.out.println(dis.read()); // 75
System.out.println(dis.available()); // 1
// [76, 68, 6, 0, 39, -41, 5, 79]
System.out.println(Arrays.toString(dis.readAllBytes()));
System.out.println(dis.available()); // 0
}
void close ()
可能であれば try-with-resources文 を使うことをおすすめします。
final var file = Path.of("R:", "java-work", "aaa.data");
System.out.println(file); // R:\java-work\aaa.data
Files.writeString(file, "aaaaaaaaaa");
try (final var dis = new DeflaterInputStream(Files.newInputStream(file))) {
final var compressed = dis.readAllBytes();
// [120, -100, 75, 76, 68, 6, 0, 39, -41, 5, 79]
System.out.println(Arrays.toString(compressed));
}
try-with-resources文を使わない例です。
final var file = Path.of("R:", "java-work", "aaa.data");
System.out.println(file); // R:\java-work\aaa.data
Files.writeString(file, "aaaaaaaaaa");
final var dis = new DeflaterInputStream(Files.newInputStream(file));
try {
final var compressed = dis.readAllBytes();
// [120, -100, 75, 76, 68, 6, 0, 39, -41, 5, 79]
System.out.println(Arrays.toString(compressed));
} finally {
dis.close();
}
void mark (int limit)
final var buf = "aaaaaaaaaaaaaa".getBytes();
try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
System.out.println("markSupported : " + dis.markSupported());
dis.mark(0);
dis.reset();
} catch (IOException e) {
System.out.println("IOException! : " + e.getMessage());
}
// 結果
// ↓
//markSupported : false
//IOException! : mark/reset not supported
boolean markSupported ()
このメソッドの使用例は、mark(int limit) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
int read ()
final var buf = "aaaaaaaaaaaaaa".getBytes();
try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
System.out.println(dis.read()); // 120
System.out.println(dis.read()); // 156
System.out.println(dis.read()); // 75
System.out.println(dis.read()); // 76
System.out.println(dis.read()); // 68
System.out.println(dis.read()); // 6
System.out.println(dis.read()); // 0
System.out.println(dis.read()); // 39
System.out.println(dis.read()); // 215
System.out.println(dis.read()); // 5
System.out.println(dis.read()); // 79
System.out.println(dis.read()); // -1
}
int read (byte[] b, int off, int len)
final var buf = "aaaaaaaaaaaaaa".getBytes();
try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
// [120, -100, 75, 76, 68, 6, 0, 39, -41, 5, 79]
System.out.println(Arrays.toString(dis.readAllBytes()));
}
try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
final var b1 = new byte[5];
System.out.println(dis.read(b1, 0, 3)); // 3
System.out.println(Arrays.toString(b1)); // [120, -100, 75, 0, 0]
final var b2 = new byte[5];
System.out.println(dis.read(b2, 1, 2)); // 2
System.out.println(Arrays.toString(b2)); // [0, 76, 68, 0, 0]
final var b3 = new byte[8];
System.out.println(dis.read(b3, 0, 8)); // 6
System.out.println(Arrays.toString(b3)); // [6, 0, 39, -41, 5, 79, 0, 0]
}
void reset ()
このメソッドの使用例は、mark(int limit) にまとめて記載しました。
そちらのAPI使用例をご参照ください。
long skip (long n)
final var buf = "aaaaaaaaaaaaaa".getBytes();
try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
// [120, -100, 75, 76, 68, 6, 0, 39, -41, 5, 79]
System.out.println(Arrays.toString(dis.readAllBytes()));
}
try (final var dis = new DeflaterInputStream(new ByteArrayInputStream(buf))) {
System.out.println(dis.skip(5)); // 5
// [6, 0, 39, -41, 5, 79]
System.out.println(Arrays.toString(dis.readAllBytes()));
}
FilterInputStreamで宣言されたメソッド
read
「Java API 使用例 : FilterInputStream」をご参照ください。
InputStreamで宣言されたメソッド
nullInputStream, readAllBytes, readNBytes, readNBytes, skipNBytes, transferTo
「Java API 使用例 : InputStream」をご参照ください。