Wenn Sie das Komprimierungs-Toolkit verwenden, das mit Java geliefert wird, um die Funktion der Dekomprimierung von Dateien in den angegebenen Ordner zu implementieren, da der von JDK bereitgestellte Reißverschluss nur im UTF-8-Format verarbeitet werden kann und der Dateiname in Windows-System in GBK codiert ist Wenn also ein ZIP -Paket mit dem chinesischen Dateinamen entpackt wird und eine illegale Parameterausnahme meldet. Java und ZipoutputStream.java.
Da J2SE 1.4 der Java -Compiler nicht mehr importieren, die Klassen oder Schnittstellen für unbenannte Paketnamen haben. In dem von Ihnen erstellten Java -Projekt müssen Sie ein neues Paket erstellen, das Sie selbst definieren. des Schuldomainnamens +eigener Netzwerkname, wie z. B. cn.edu.xidian.crytoll.
Erstellen Sie eine neue DeflateroutputStream -Klasse im Paket, der Code ist wie folgt:
DeflateroutputStream.java:
Die Codekopie lautet wie folgt:
Paket cn.edu.xdian.crytoll;
importieren java.io.filteroutputStream;
importieren java.io.ioException;
importieren java.io.outputstream;
import Java.util.zip.deflater;
/**
* Diese Klasse implementiert einen Ausgangsstromfilter für Komprimierungsdaten in
* Das "Deflate" -Kompressionsformat.
* Arten von Komprimierungsfiltern wie GzipoutputStream.
*
* @see Deflater
* @Version 1.36, 13.03.06
* @Author David Connelly
*/
öffentlich
Klasse DeflateroutputStream erweitert FilteroutputStream {
/**
* Kompressor für diesen Strom.
*/
geschützter Deflater def;
/**
* Ausgabepuffer zum Schreiben von komprimierten Daten.
*/
geschütztes Byte [] buf;
/**
* Zeigt an, dass der Strom geschlossen wurde.
*/
privat boolean geschlossen = falsch;
/**
* Erstellt mit dem angegebenen Kompressor einen neuen Ausgangsstrom und
* Puffergröße.
* @param aus dem Ausgangsstream aus
* @param def den Kompressor ("Deflater")
* @Param Größe Die Ausgangspuffergröße
* @Exception illegalArgumentException Wenn die Größe <= 0 ist
*/
public DeflateroutputStream (Ausgabestream, Deflater def, int size) {
Super (out);
if (out == null || def == null) {
neue nullpointerexception () werfen;
} else if (Größe <= 0) {
neue IllegalArgumentException ("Puffergröße <= 0" werfen);
}
this.def = def;
buf = neues Byte [Größe];
}
/**
* Erstellt mit dem angegebenen Kompressor einen neuen Ausgangsstrom und
* Eine Standardpuffergröße.
* @param aus dem Ausgangsstream aus
* @param def den Kompressor ("Deflater")
*/
public DeflateroutputStream (outputStream, Deflater def) {
Dies (out, def, 512);
}
boolean useDefaultDeflater = false;
/**
* Erstellt einen neuen Ausgabestream mit einem Standardkompressor und einer Puffergröße.
* @param aus dem Ausgangsstream aus
*/
public DeflateroutputStream (outputStream) {
Dies (out, New DeFlater ());
useDefaultDeflater = true;
}
/**
* Schreibt ein Byte in den komprimierten Ausgangsstrom
* Blockieren Sie, bis das Byte geschrieben werden kann.
* @param b das zu geschriebene Byte
* @Exception ioException, wenn ein E/A -Fehler aufgetreten ist
*/
public void write (int b) löst ioException {aus {
Byte [] buf = neues Byte [1];
buf [0] = (byte) (B & 0xff);
schreiben (buf, 0, 1);
}
/**
* Schreibt eine Reihe von Bytes in den komprimierten Ausgangsstrom
* Die Methode blockiert, bis alle Bytes geschrieben sind.
* @param b Die zu schriftlichen Daten
* @param aus dem Startversatz der Daten
* @param len die Länge der Daten
* @Exception ioException, wenn ein E/A -Fehler aufgetreten ist
*/
public void write (byte [] b, int off, int len) löst ioException {aus
if (def.finished ()) {
neue IOException werfen ("Schreiben Sie über das Ende des Streams hinaus");
}
if ((off | len | (off + len) | (b.Length - (aus + len)) <0) {
neue indexoutofboundSexception () werfen;
} else if (len == 0) {
zurückkehren;
}
if (! def.finished ()) {
// Entleeren Sie nicht mehr als Bytes nach dem anderen
// überschüssiges Kopieren in Deflatebytes (siehe Deflater.c)
int stride = buf.length;
für (int i = 0; i <len; i+= stride) {
Def.SetInput (b, off + i, math.min (stride, len - i));
while (! def.needsinput ()) {
Deflate ();
}
}
}
}
/**
* Vervollständigt das Schreiben von komprimierten Daten in den Ausgabestream, ohne zu schließen
* Der zugrunde liegende Strom.
* Nachfolge desselben Ausgabestreams.
* @Exception ioException, wenn ein E/A -Fehler aufgetreten ist
*/
public void finded () löst ioException {aus
if (! def.finished ()) {
def.finish ();
while (! def.finished ()) {
Deflate ();
}
}
}
/**
* Schreibt verbleibende komprimierte Daten in den Ausgangsstrom und schließt die
* zugrunde liegender Strom.
* @Exception ioException, wenn ein E/A -Fehler aufgetreten ist
*/
public void close () wirft ioException {aus
if (! geschlossen) {
beenden();
if (useDefaultDeflater)
verteidigen();
out.close ();
geschlossen = wahr;
}
}
/**
* Schreibt den nächsten Block komprimierter Daten in den Ausgangsstrom.
* @throws ioException, wenn ein E/A -Fehler aufgetreten ist
*/
Protected void Deflate () löst IoException {aus
int len = def.Deflate (buf, 0, buf.length);
if (len> 0) {
out.write (buf, 0, len);
}
}
}