Если вы используете инструментарий сжатия, который поставляется с Java для реализации функции декомпрессирующих файлов в указанную папку, потому что ZIP, предоставляемый JDK, может быть обработан только в формате UTF-8, а имя файла в системе Windows кодируется в GBK,, Таким образом, если он должен распаковать пакет ZIP, содержащий китайское имя файла, и он сообщит о незаконном исключении параметров, чтобы реализовать декомпрессию, вы должны DeflateroutputStream.java, FulaterinptStream.java, Zipconstants.java, Zipentry.java, Zipinptream. Java и zipoutputstream.java.
Поскольку J2SE 1.4 Компилятор Java больше не поддерживает импортные классы или интерфейсы для неназванных имен пакетов, поэтому в проекте Java вы создаете, вы должны создать новый пакет, который вы определяете себя. школьного доменного имени +собственное имя сети, такое как cn.edu.xidian.crytoll.
Создайте новый класс DeflaterOutputStream в пакете, код заключается в следующем:
DeflaterOutputStream.java:
Кода -копия выглядит следующим образом:
Пакет cn.edu.xdian.crytoll;
импортировать java.io.filteroutputstream;
импортировать java.io.ioexception;
импортировать java.io.outputstream;
импортировать java.util.zip.deflater;
/**
* Этот класс реализует фильтр выходного потока для сжатия данных в
* Формат сжатия «дефляции».
* Типы фильтров сжатия, такие как gzipoutputstream.
*
* @see Deflater
* @version 1.36, 13.03.06
* @author Дэвид Коннелли
*/
публичный
класс DeflaterOutputStream Extends FilterOutputStream {
/**
* Компрессор для этого потока.
*/
Защищенный дефлекс def;
/**
* Вывод буфера для написания сжатых данных.
*/
защищенный байт [] BUF;
/**
* Указывает, что поток был закрыт.
*/
Частный логический закрытый = false;
/**
* Создает новый выходной поток с указанным компрессором и
* Размер буфера.
* @param Out выходной поток
* @param def Компрессор ("Deflater")
* @param size размер выходного буфера
* @Exception allogalargumentException, если размер <= 0
*/
public DefflaterOutputStream (outputStream Out, Deflater def, int size) {
супер (Out);
if (out == null || def == null) {
бросить новое NullPointerException ();
} else if (size <= 0) {
бросить новое allosalargumentException ("размер буфера <= 0");
}
this.def = def;
BUF = новый байт [размер];
}
/**
* Создает новый выходной поток с указанным компрессором и
* Размер буфера по умолчанию.
* @param Out выходной поток
* @param def Компрессор ("Deflater")
*/
public DefflaterOutputStream (outputStream Out, Deflater def) {
это (Out, def, 512);
}
Boolean использует defaultdeflater = false;
/**
* Создает новый выходной поток с компрессором по умолчанию и размером буфера.
* @param Out выходной поток
*/
public DefflaterOutputStream (outputStream Out) {
это (out, новый Deflater ());
использует defaultdeflater = true;
}
/**
* Записывает байт в сжатый выходной поток
* Блок до тех пор, пока байт не будет записан.
* @param b байт, который будет написан
* @Exception ioException, если произошла ошибка ввода/вывода
*/
public void написать (int b) бросает ioException {
byte [] buf = new Byte [1];
buf [0] = (byte) (b & 0xff);
написать (buf, 0, 1);
}
/**
* Записывает массив байтов в сжатый выходной поток
* Метод будет блокироваться до тех пор, пока все байты не будут записаны.
* @param b Данные, которые будут написаны
* @param от начала смещения данных
* @param len длиной данных
* @Exception ioException, если произошла ошибка ввода/вывода
*/
public void написать (byte [] b, int off, int len) бросает ioexception {
if (def.fined ()) {
бросить новое ioException («написать за пределами конца потока»);
}
if ((off | len | (off + len) | (b.length - (off + len))) <0) {
бросить новый indexoutofboundsexception ();
} else if (len == 0) {
возвращаться;
}
if (! def.fined ()) {
// Дефлятся не более, чем шаги байтов за раз
// избыточное копирование в DeflateBytes (см. Deflater.c)
int stride = buf.length;
для (int i = 0; i <len; i+= stride) {
def.setinput (b, off + i, math.min (stride, len - i));
while (! def.needsinput ()) {
Deflate ();
}
}
}
}
/**
* Завершает написание сжатых данных в выходной поток без закрытия
* Основной поток.
* Подряд к тому же выходному потоку.
* @Exception ioException, если произошла ошибка ввода/вывода
*/
public void finish () бросает ioException {
if (! def.fined ()) {
def.finish ();
while (! def.fined ()) {
Deflate ();
}
}
}
/**
* Записывает оставшиеся сжатые данные в выходной поток и закрывает
* Основной поток.
* @Exception ioException, если произошла ошибка ввода/вывода
*/
public void cloid () бросает ioException {
if (! закрыто) {
заканчивать();
if (использует defaultdeflater)
защищать();
out.close ();
закрыто = true;
}
}
/**
* Записывает следующий блок сжатых данных в выходной поток.
* @Throws IOException, если произошла ошибка ввода/вывода
*/
Защищенная void defflate () бросает ioException {
int len = def.deflate (buf, 0, buf.length);
if (len> 0) {
out.write (buf, 0, len);
}
}
}