Jika Anda menggunakan toolkit kompresi yang dilengkapi dengan Java untuk mengimplementasikan fungsi dekompresi file ke folder yang ditentukan, karena zip yang disediakan oleh JDK hanya dapat diproses dalam format UTF-8, dan nama file dalam sistem Windows dikodekan dalam GBK, Jadi jika itu untuk membuka ritsleting paket zip yang berisi nama file Cina, dan itu akan melaporkan pengecualian parameter ilegal. Java, dan ZipoutputStream.java.
Karena J2SE 1.4, kompiler Java tidak lagi mendukung mengimpor kelas atau antarmuka untuk nama paket yang tidak disebutkan namanya, jadi dalam proyek Java yang Anda buat, Anda harus membuat paket baru yang Anda definisikan sendiri. dari nama domain sekolah +nama jaringan sendiri, seperti cn.edu.xidian.crytoll.
Buat kelas DeflaterOutputStream baru dalam paket, kode ini adalah sebagai berikut:
DeflateroutputStream.java:
Salinan kode adalah sebagai berikut:
paket cn.edu.xdian.crytoll;
impor java.io.filteroutputStream;
impor java.io.ioException;
impor java.io.outputStream;
impor java.util.zip.deflater;
/**
* Kelas ini mengimplementasikan filter aliran output untuk mengompresi data di
* Format kompresi "mengempiskan" juga digunakan sebagai dasar untuk yang lain
* Jenis filter kompresi, seperti GzipoutputStream.
*
* @see Deflater
* @Version 1.36, 03/13/06
* @author David Connelly
*/
publik
kelas deflateroutputStream memperluas filteroutputStream {
/**
* Kompresor untuk aliran ini.
*/
Def deflater yang dilindungi;
/**
* Buffer output untuk menulis data terkompresi.
*/
byte yang dilindungi [] buf;
/**
* Menunjukkan bahwa aliran telah ditutup.
*/
Private Boolean tertutup = false;
/**
* Membuat aliran output baru dengan kompresor yang ditentukan dan
* Ukuran buffer.
* @param keluar aliran output
* @param def kompresor ("deflater")
* Ukuran @param Ukuran buffer output
* @Exception IllegalArgumentException jika ukurannya <= 0
*/
DeflaterOutputStream publik (outputStream out, deflater def, ukuran int) {
super (keluar);
if (out == null || def == null) {
lempar nullpointerexception baru ();
} lain jika (size <= 0) {
Lempar IllegalArgumentException baru ("Ukuran buffer <= 0");
}
this.def = def;
buf = byte baru [ukuran];
}
/**
* Membuat aliran output baru dengan kompresor yang ditentukan dan
* Ukuran buffer default.
* @param keluar aliran output
* @param def kompresor ("deflater")
*/
DeflaterOutputStream publik (outputStream out, deflater def) {
ini (keluar, def, 512);
}
boolean menggunakanDefaultDeflater = false;
/**
* Membuat aliran output baru dengan kompresor default dan ukuran buffer.
* @param keluar aliran output
*/
DeflaterOutputStream publik (outputStream out) {
ini (keluar, deflater baru ());
UseDefaultDeflater = true;
}
/**
* Menulis byte ke aliran output terkompresi
* Blokir sampai byte dapat ditulis.
* @param b byte yang akan ditulis
* @Exception IOException Jika terjadi kesalahan I/O
*/
public void write (int b) melempar ioException {
byte [] buf = byte baru [1];
buf [0] = (byte) (b & 0xff);
tulis (buf, 0, 1);
}
/**
* Menulis array byte ke aliran output terkompresi ini
* Metode akan diblokir sampai semua byte ditulis.
* @param b data yang akan ditulis
* @param off start offset data
* @param len panjang data
* @Exception IOException Jika terjadi kesalahan I/O
*/
public void write (byte [] b, int off, int len) melempar ioException {
if (def.finished ()) {
Lempar ioException baru ("Tulis Beyond End of Stream");
}
if ((off | len | (off + len) | (b.length - (off + len)) <0) {
lempar indexOutofboundsException ();
} lain jika (len == 0) {
kembali;
}
if (! def.finished ()) {
// Menguraikan tidak lebih dari langkah byte sekaligus
// Menyalin kelebihan di DeflateBytes (lihat Deflater.c)
int stride = buf.length;
untuk (int i = 0; i <len; i+= stride) {
def.setInput (b, off + i, math.min (stride, len - i));
while (! Def.needsinput ()) {
menurunkan();
}
}
}
}
/**
* Selesai menulis data terkompresi ke aliran output tanpa penutupan
* Aliran yang mendasari. Gunakan metode ini saat menerapkan beberapa filter
* Beredikan dengan aliran output yang sama.
* @Exception IOException Jika terjadi kesalahan I/O
*/
public void finish () melempar ioException {
if (! def.finished ()) {
def.finish ();
while (! def.finished ()) {
menurunkan();
}
}
}
/**
* Menulis data terkompresi yang tersisa ke aliran output dan menutup
* Aliran yang mendasari.
* @Exception IOException Jika terjadi kesalahan I/O
*/
public void close () melempar ioException {
if (! tutup) {
menyelesaikan();
if (useDefaultDeflater)
membela();
out.close ();
tertutup = true;
}
}
/**
* Menulis blok data terkompresi berikutnya ke aliran output.
* @Throws IoException Jika terjadi kesalahan I/O
*/
Deflate void yang dilindungi () melempar ioException {
int len = def.deflate (buf, 0, buf.length);
if (len> 0) {
out.write (buf, 0, len);
}
}
}