jdk가 제공 한 zip을 UTF-8 형식으로 만 처리 할 수 있고 Windows 시스템의 파일 이름은 GBK로 인코딩되기 때문에 Java와 함께 제공되는 압축 툴킷을 사용하여 지정된 폴더로 파일을 제거하는 기능을 구현하는 경우. 따라서 중국 파일 이름이 포함 된 zip 패키지를 풀고 불법 매개 변수 예외를보고하여 감압을 구현하려면 giva, Zipconstants.java, Zipentry.java, Zipinputstream. Java 및 ZipoutputStream.java.
J2SE 1.4이므로 Java 컴파일러는 더 이상 이름이없는 패키지 이름의 클래스 또는 인터페이스를 지원하지 않으므로 Java 프로젝트에서는 패키지 이름 지정 형식이 일반적으로 반대 순서입니다. 학교 도메인 이름 +CN.edu.xidian.crytoll과 같은 자체 네트워크 이름.
패키지에서 새 deflateroututputStream 클래스를 만듭니다. 코드는 다음과 같습니다.
deflateroutputStream.java :
코드 사본은 다음과 같습니다.
패키지 cn.edu.xdian.crytoll;
import java.io.filteroutputStream;
import java.io.ioexception;
import java.io.outputStream;
java.util.zip.deflater import;
/**
*이 클래스는 데이터를 압축하기위한 출력 스트림 필터를 구현합니다.
* "Deflate"압축 형식도 다른 기초로 사용됩니다
* gzipoutputStream과 같은 압축 필터 유형.
*
* @deflater
* @version 1.36, 03/13/06
* @Author David Connelly
*/
공공의
클래스 deflateroutputStream 확장 FilterOutputStream {
/**
*이 스트림의 압축기.
*/
보호 된 DEFLATER DEF;
/**
* 압축 데이터를 작성하기위한 출력 버퍼.
*/
보호 된 바이트 [] buf;
/**
* 스트림이 닫혔다는 것을 나타냅니다.
*/
개인 부울 폐쇄 = 거짓;
/**
* 지정된 압축기를 사용하여 새 출력 스트림을 생성하고
* 버퍼 크기.
* @param 출력 스트림을 제거합니다
* @param def compressor ( "deflater")
* @param 크기 출력 버퍼 크기
* @exception 불법 행위 exception 크기가 <= 0 인 경우
*/
public deflateroutputStream (outputStream out, deflater def, int size) {
슈퍼 (아웃);
if (out == null || def == null) {
새로운 nullpointerexception ()을 던지십시오.
} else if (size <= 0) {
새로운 불법 행정 exception ( "버퍼 크기 <= 0")을 던지십시오.
}
this.def = def;
buf = 새로운 바이트 [크기];
}
/**
* 지정된 압축기를 사용하여 새 출력 스트림을 생성하고
* 기본 버퍼 크기.
* @param 출력 스트림을 제거합니다
* @param def compressor ( "deflater")
*/
public deflateroutputStream (outputStream out, deflater def) {
이것은 (out, def, 512);
}
부울 audesDefaultDeflater = false;
/**
* 기본 압축기 및 버퍼 크기로 새 출력 스트림을 만듭니다.
* @param 출력 스트림을 제거합니다
*/
public deflateroutputStream (outputStream out) {
이것 (out, new deflater ());
audesDefaultDeflater = true;
}
/**
* 압축 출력 스트림에 바이트를 씁니다
* 바이트를 쓸 수있을 때까지 차단하십시오.
* @param b 바이트를 작성합니다
* @Exception ioException I/O 오류가 발생한 경우
*/
공개 void write (int b)는 ioexception {
바이트 [] buf = 새로운 바이트 [1];
buf [0] = (byte) (b & 0xff);
쓰기 (buf, 0, 1);
}
/**
* 압축 된 출력 스트림에 바이트 배열을 씁니다
* 메소드는 모든 바이트가 작성 될 때까지 차단됩니다.
* @param b 작성할 데이터
* @param 데이터의 시작 오프셋
* @param len 데이터 길이
* @Exception ioException I/O 오류가 발생한 경우
*/
public void write (byte [] b, int off, int len) ioexception {
if (def.finished ()) {
새로운 ioexception을 던지십시오 ( "스트림 끝 너머로 쓰기");
}
if ((Off | Len | (Off + Len) | (B.length- (Off + Len))) <0) {
새로운 IndexOutOfBoundSexection ()을 던지십시오.
} else if (len == 0) {
반품;
}
if (! def.finished ()) {
// 한 번에 스트라이드 바이트 이상을 피하십시오
// deflatebytes의 초과 복사 (deflater.c 참조)
int stride = buf.length;
for (int i = 0; i <len; i+= stride) {
def.setInput (b, off + i, math.min (stride, len -i));
while (! def.needsinput ()) {
꺾다();
}
}
}
}
/**
* 닫히지 않고 출력 스트림에 압축 데이터를 작성합니다.
* 기본 스트림. 여러 필터를 적용 할 때이 방법을 사용합니다
* 동일한 출력 스트림으로 연속적으로.
* @Exception ioException I/O 오류가 발생한 경우
*/
public void finish ()는 ioexception {
if (! def.finished ()) {
def.finish ();
while (! def.finished ()) {
꺾다();
}
}
}
/**
* 나머지 압축 데이터를 출력 스트림에 쓰고
* 기본 스트림.
* @Exception ioException I/O 오류가 발생한 경우
*/
public void close ()는 ioexception {
if (! closed) {
마치다();
if (usedefaultDeflater)
지키다();
out.close ();
폐쇄 = 참이고;
}
}
/**
* 압축 데이터의 다음 블록을 출력 스트림에 씁니다.
* @throws ioexception I/O 오류가 발생한 경우
*/
보호 된 void deflate ()는 ioexception {
int len = def.deflate (buf, 0, buf.length);
if (len> 0) {
out.write (Buf, 0, Len);
}
}
}