Zip com caracteres especiais, erro ao extrair

Fala, galera.
Segue primeiro a descrição do problema, e depois o código:
Via código java, estou tentando extrair um arquivo zip cujo conteúdo tem vários arquivos (claro). Entretanto, um dos arquivos que está dentro do zip tem nome com caracteres especiais, e ao executar getInputStream passando ele como parâmetro, recebo null, então acontece a exceção.
Veja… o nome do arquivo lá dentro do zip é aplicaÇõÇæes.htm
Quando da erro, aparece no log que deu erro ao ler entrada aplicações.htm
Então eu fui lá dentro do arquivo zip e renomeei o aplicaÇõÇæes.htm para aplicações.htm. Continua tendo caracteres especiais, como “ç” e “õ”, mas pelo menos não tem “æ” (esse ‘a’ e ‘e’ colados).
Ao tentar extrair, deu erro de novo…
Ou seja, mesmo quando o nome do arquivo lá dentro do zip é aplicações.htm
Quando da erro, aparece no log que deu erro ao ler entrada aplica?äes.htm
Então eu fui lá dentro do arquivo zip de novo e renomeei o aplicações.htm para aplicacoes.htm. O erro parou…
Mas eu tenho que arrumar um jeito de conseguir extrair arquivos zip independente se ele tem arquivos com caracteres especiais ou não, seja “ç”, “õ”, ou “æ”.
O que pode estar acontecendo de errado?
Código Java:

	public void extrair(File arquivoZip, File diretorio, boolean sobrescrever)throws ZipException, IOException {
		ZipFile zip = null;
		File arquivo = null;
		InputStream is = null;
		OutputStream os = null;
		byte[] buffer = new byte[TAMANHO_BUFFER];
		try {
			// cria diret�rio informado, caso n�o exista
			if(!arquivoZip.exists()) {
				throw new ZipException("Arquivo zip inexistente!");				
			}
			if (!diretorio.exists()) {
				diretorio.mkdirs();
			}
			if (!diretorio.exists() || !diretorio.isDirectory()) {
				throw new ZipException("Diretório inválido!");
			}
			zip = new ZipFile(arquivoZip);
			Enumeration e = zip.entries();
			while (e.hasMoreElements()) {
				ZipEntry entrada = (ZipEntry) e.nextElement();
				arquivo = new File(diretorio, entrada.getName());
				// se for diret�rio inexistente, cria a estrutura
				// e pula pra pr�xima entrada
				if (entrada.isDirectory())
				{
					if(!arquivo.exists() || !arquivo.isDirectory()) {
						arquivo.mkdirs();
					}
					continue;
				}
				// se a estrutura de diret�rios n�o existe, cria
				if (!arquivo.getParentFile().exists()) {
					arquivo.getParentFile().mkdirs();
				}
				if(arquivo.exists() && arquivo.isFile() && sobrescrever) {
					arquivo.delete();
				}
				try {
					// l� o arquivo do zip e grava em disco
					is = zip.getInputStream(entrada);
					os = new FileOutputStream(arquivo);
					int bytesLidos = 0;
					if (is == null) {
						throw new ZipException("Erro ao ler a entrada do zip: "
								+ entrada.getName());
					}
					while ((bytesLidos = is.read(buffer)) > 0) {
						os.write(buffer, 0, bytesLidos);
					}
				} finally {
					if (is != null) {
						try {
							is.close();
						} catch (Exception ex) {
						}
					}
					if (os != null) {
						try {
							os.close();
						} catch (Exception ex) {
						}
					}
				}
			}
		} finally {
			if (zip != null) {
				try {
					zip.close();
				} catch (Exception e) {
				}
			}
		}
	}

up

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4244499

Obrigado, thingol. Mas li sobre o BUG, e continuo sem saber com resolver o problema…
Você tem alguma ideia?
Obrigado

Também não tenho uma idéia muito boa de o que fazer. Quem criou o arquivo zip? Se for uma aplicação Windows, ele deve ter criado os arquivos com nomes em Windows-1252, não UTF-8. O problema, pelo que vi, é que zipEntry deve estar tentando interpretar isso como UTF-8, e nesse caso vai dar algum problema.

Pois é… Fedeu! hehehe
Alguém aí tem mais alguma ideia?
thingol, vc tem mais alguma solução, além dessa minha função?

A última vez que tive de criar e abrir arquivos .zip eu tinha feito duas coisas:

a) O arquivo zip era o meu sistema que os criava e abria, então os nomes eram completamente controlados e, obviamente, não tinham caracteres diferentes de 0-9 A-F;

b) Como eu tinha de lidar com arquivos .zip quebrados em vários disquetes, então eu não podia usar ZipInputStream e ZipOutputStream. Eu tive que fazer quase tudo a partir do zero (eu podia usar ZlibInputStream e ZLibOutputStream, no entanto).

Portanto eu ainda não sei exatamente como contornar isso.

Beleza, thingol!
De qualquer jeito, obrigado pela ajuda.
Vou continuar tentando resolver aqui…
Se alguém souber alguma coisa, por favor, se manifeste!
Valeuuuuuuu

Olá, também estou com o mesmo problema com os caracteres especiais…

Outro problema que vi foi o seguinte:
dentro do arquivo.zip tenho pastas e arquivos, quando extraio pela primeira vez funciona certinho, Mas quando eu extraio pela segunda vez ele dá erro.
Ele sobrescreve os arquivos, mas as pasta não consegue.

Alguém já passou por este problema?

[quote=carlinhoscomp]Olá, também estou com o mesmo problema com os caracteres especiais…

Outro problema que vi foi o seguinte:
dentro do arquivo.zip tenho pastas e arquivos, quando extraio pela primeira vez funciona certinho, Mas quando eu extraio pela segunda vez ele dá erro.
Ele sobrescreve os arquivos, mas as pasta não consegue.

Alguém já passou por este problema?[/quote]

Consegui resolver esse meu problema!
No código do Thitoh fica assim:

if (!entrada.isDirectory()) { //Acrescente esta condição
           try {  
                // l� o arquivo do zip e grava em disco  
                is = zip.getInputStream(entrada);  
                os = new FileOutputStream(arquivo);  
                int bytesLidos = 0;  
                if (is == null) {  
                    throw new ZipException("Erro ao ler a entrada do zip: "  
                            + entrada.getName());  
                }  
                while ((bytesLidos = is.read(buffer)) > 0) {  
                    os.write(buffer, 0, bytesLidos);  
                }  
            } finally {  
                if (is != null) {  
                    try {  
                        is.close();  
                    } catch (Exception ex) {  
                    }  
                }  
                if (os != null) {  
                    try {  
                        os.close();  
                    } catch (Exception ex) {  
                    }  
                }  
            }  
}

Ao extrair arquivos .zip é preciso criar os subdiretórios antes de criar os arquivos, caso não existam.

“new FileOutputStream” só cria um arquivo, não cria os subdiretórios necessários.

Ficou pendende o erro com os caracteres…