¡Ayuda! java.lang.ArrayIndexOutOfBoundsException inesperados al utilizar ByteArrayInputStream

StackOverflow https://stackoverflow.com/questions/3953379

  •  08-10-2019
  •  | 
  •  

Pregunta

consigo un java.lang.ArrayIndexOutOfBoundsException cuando se utiliza ByteArrayInputStream.

En primer lugar, utilizar un ZipInputStream a leer a través de un archivo zip, y mientras bucle a través de los zipEntries, Yo uso un ByteArrayInputStream para capturar los datos de cada ZipEntry utilizando la ZipInputStream.read (byte [] b) y ByteArrayInputStream (byte [] b) métodos.

Al final, I tiene un total de 6 objetos ByteArrayInputStream diferentes que contienen datos de 6 zipEntries diferentes. Luego utilizo OpenCSV a leer a través de cada uno de los ByteArrayInputStream.

No tengo ningún problema de lectura de 4 de los 6 objetos ByteArrayInputStream, de los cuales tienen tamaños de byte inferior a 2000.

Los otros 2 objetos ByteArrayInputStream tienen tamaños de bytes de 2155 y 4010, respectivamente, y la CSVReader sólo fue capaz de leer una parte de estos 2 objetos, a continuación, dar una java.lang.ArrayIndexOutOfBoundsException.

Este es el código que se utiliza para bucle a través de la ZipInputStream

    InputStream fileStream = attachment.getInputStream();

    try {

        ZipInputStream zippy = new ZipInputStream(fileStream);
        ZipEntry entry = zippy.getNextEntry();

        ByteArrayInputStream courseData = null;

        while (entry!= null) {

            String name = entry.getName();
            long size = entry.getSize();

            if (name.equals("course.csv")) {
                courseData = copyInputStream(zippy, (int)size);
            }
            //similar IF statements for 5 other ByteArrayInputStream objects 
            entry = zippy.getNextEntry(); 
        }

        CourseDataManager.load(courseData);
    }catch(Exception e){
       e.printStackTrace();
    }

El siguiente es el código con el que utilizo para copiar los datos de la ZipInputStream a la ByteArrayInputStream.

public ByteArrayInputStream copyInputStream(InputStream in, int size)
        throws IOException {
    byte[] buffer = new byte[size];

    in.read(buffer);
    ByteArrayInputStream b = new ByteArrayInputStream(buffer);
    return b;

}

Los 2 juegos de códigos openCSV son capaces de leer unas pocas líneas de datos, antes de tirar esa excepción, lo que me lleva a creer que es la bytearray que está causando el problema. ¿Hay algo que pueda hacer o evitar este problema? Estoy tratando de hacer una aplicación que acepte un archivo zip, si bien no almacenar los archivos temporales de la aplicación web, ya que estoy desplegando tanto de Google App Engine y Tomcat servidor.

fijo !!! Gracias a Stephen C, me di cuenta que de lectura (byte []) no ha leído todo lo que ajusté el código para hacer que el copyInputStream completamente funcional.

¿Fue útil?

Solución

Dado que esto se parece a la tarea, aquí va una pista:

El método read(byte[]) devuelve el número bytes leídos.

Otros consejos

En qué línea se obtiene el error? Y ha comprobado el valor de size? Sospecho que es 0

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top