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) {
}
}
}
}