역사상 가장 간단하게 Zip Output Stream 압축 파일 의 중국어 이름 난 장 판 문 제 를 해결 하 다

키워드 "Zip Output Stream 압축 중국어 난 코드 문제" 를 크게 사용 하 는 것 은 두 가지 방법 일 뿐 입 니 다.
첫 번 째 는 JDK 소스 코드 를 바 꾸 고 Zip OutputStream 을 복사 하여 인 코딩 을 수정 하 는 것 입 니 다.
두 번 째 는 아파 치 - ant.
이 두 가지 방법 은 상세 하 게 볼 수 있다.http://blog.csdn.net/zhanghw0917/article/details/5628039
여기 서 가장 간단 한 방법 을 소개 합 니 다. 소스 코드 를 바 꾸 지 않 아 도 되 고 apache - ant 를 바 꾸 지 않 아 도 됩 니 다. 위의 두 가지 방법 으로 중국어 코드 가 어 지 러 워 지 는 문 제 는 모두 JDK 6 를 바탕 으로 하 는 것 이지 만 JDK 7 에서 이미 해결 되 었 습 니 다. JDK 버 전 을 7 로 올 리 면 됩 니 다.
두 버 전의 소스 코드 를 비교 해 보면 알 수 있다.
JDK6u 21 의 ZipOutput Stream. java 의 원본 세 션:
	/**
	 * Creates a new ZIP output stream.
	 * 
	 * @param out
	 * the actual output stream
	 */
	public ZipOutputStream(OutputStream out) {
		super(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true));
		usesDefaultDeflater = true;
	}
	
	/**
	 * Sets the ZIP file comment.
	 * 
	 * @param comment
	 * the comment string
	 * @exception IllegalArgumentException
	 * if the length of the specified ZIP file comment is greater
	 * than 0xFFFF bytes
	 */
	public void setComment(String comment) {
		if (comment != null && comment.length() > 0xffff / 3
				&& getUTF8Length(comment) > 0xffff) {
			throw new IllegalArgumentException("ZIP file comment too long.");
		}
		this.comment = comment;
	}

JDK7u 65 의 ZipOutput Stream. java 의 원본 세 션:
/**
     * Creates a new ZIP output stream.
     *
     * <p>The UTF-8 {@link java.nio.charset.Charset charset} is used
     * to encode the entry names and comments.
     *
     * @param out the actual output stream
     */
    public ZipOutputStream(OutputStream out) {
        this(out, StandardCharsets.UTF_8);
    }

    /**
     * Creates a new ZIP output stream.
     *
     * @param out the actual output stream
     *
     * @param charset the {@linkplain java.nio.charset.Charset charset}
     *                to be used to encode the entry names and comments
     *
     * @since 1.7
     */
    public ZipOutputStream(OutputStream out, Charset charset) {
        super(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true));
        if (charset == null)
            throw new NullPointerException("charset is null");
        this.zc = ZipCoder.get(charset);
        usesDefaultDeflater = true;
    }

    /**
     * Sets the ZIP file comment.
     * @param comment the comment string
     * @exception IllegalArgumentException if the length of the specified
     *            ZIP file comment is greater than 0xFFFF bytes
     */
    public void setComment(String comment) {
        if (comment != null) {
            this.comment = zc.getBytes(comment);
            if (this.comment.length > 0xffff)
                throw new IllegalArgumentException("ZIP file comment too long.");
        }
    }

JDK 6 버 전에 서 알 수 있 듯 이 하나의 OutputStream 매개 변 수 를 가 진 구조 방법 만 있 고 문자 집합 에 들 어 오지 않 았 다. JDK 7 버 전에 서 는 두 가지 구조 방법 이 있 는데 하 나 는 OutputStream 과 Charset 를 가 진 구조 방법 이 고 다른 하 나 는 다시 불 러 오 는 것 이 며 하나의 OutputStream 만 있 고 기본 문자 집합 은 UTF - 8 이다.

좋은 웹페이지 즐겨찾기