Extrayendo archivo con error ZipInputStream UTFDataFormatException

Tengo un error al intentar extraer los archivos de un archivo .zip que he almacenado en mi carpeta de activos, el error aparece porque mi archivo tiene el carácter ñ. El error aparece cuando intento obtener la siguiente entrada:zipIs.getNextEntry()

private void loadzip(String folder, InputStream inputStream) throws IOException
{
            ZipInputStream zipIs = new ZipInputStream(inputStream); 
            ZipEntry ze = null;

            int i=0;
                while ((ze = zipIs.getNextEntry()) != null) {

                    FileOutputStream fout = new FileOutputStream(folder +"/"+ ze.getName());

                    byte[] buffer = new byte[1024];
                    int length = 0;

                    while ((length = zipIs.read(buffer))>0) {
                    fout.write(buffer, 0, length);
                    }


                    zipIs.closeEntry();
                    fout.close();


                }
                zipIs.close();
}
SOLUCIÓN

Utilizandozip4j

private void loadZip(String zipFileName, String destination)
        {
            ZipFile zipFile = null;
            List<FileHeader> headers = null;
            try {
                zipFile = new ZipFile(zipFileName);
                headers = zipFile.getFileHeaders();

            } catch (ZipException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            if(headers != null)
            {
                for(int i=0;i<headers.size();i++)
                {
                    try {
                        zipFile.extractFile(headers.get(i),destination);

                    } catch (ZipException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }
            }

        }

.................................................. .................................................. .............................

Si desea cargar desde activos (mi caso), debe mover su zip a la carpeta sdcard y luego extraerlo:

private ArrayList<String> moveZipsFromAssets(String[] zipsAssets, String destination)
        {
            ArrayList<String> zips = new ArrayList<String>();
            for(int i=0;i<zipsAssets.length;i++)
            {
                InputStream inputStream = getInputStream(zipsAssets[i]);
                Log.d(tag, ""+zipsAssets[i]);
                File file = new File(destination+"/"+zipsAssets[i]);
                try {
                        FileOutputStream outputStream = new FileOutputStream(file);

                        int read = 0;
                        byte[] bytes = new byte[1024];

                        while ((read = inputStream.read(bytes)) != -1) {
                            outputStream.write(bytes, 0, read);
                        }

                        outputStream.close();
                        zips.add(destination+"/"+zipsAssets[i]);
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            return zips;
        }

ejemplo de uso (tenemos una carpeta assets / myZipsFolder / where are all the zips): `ArrayList

zipsExternos = moveZipsFromAssets(getAssets().list("myZipsFolder"),
                    Environment.getExternalStorageDirectory()+"/myZipsFolder");

//and load the zips:
for(int i=0;i<zipsExternos.size();i++)
   loadZip(zipsExternos.get(i),Environment.getExternalStorageDirectory()+"/myZipsFolder");

Respuestas a la pregunta(1)

Su respuesta a la pregunta