Aiuto! java.lang.ArrayIndexOutOfBoundsException inaspettata quando si utilizza ByteArrayInputStream

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

  •  08-10-2019
  •  | 
  •  

Domanda

ho un java.lang.ArrayIndexOutOfBoundsException quando si utilizza ByteArrayInputStream.

Per prima cosa, io uso uno ZipInputStream di leggere un file zip, e mentre scorrendo le zipEntries, Io uso un ByteArrayInputStream per catturare i dati di ogni ZipEntry usando il ZipInputStream.read (byte [] b) e ByteArrayInputStream (byte [] b) i metodi.

Alla fine, ho un totale di 6 differenti oggetti ByteArrayInputStream contenenti dati provenienti da 6 zipEntries differenti. Ho quindi utilizzare OpenCSV per leggere ciascuno dei ByteArrayInputStream.

Non ho alcun problema di lettura 4 degli oggetti 6 ByteArrayInputStream, di cui con dimensioni di byte di meno di 2000.

Le altre 2 oggetti ByteArrayInputStream hanno dimensioni byte del 2155 e 4010, rispettivamente, e il CSVReader era in grado di leggere parte di questi oggetti 2, quindi invia un java.lang.ArrayIndexOutOfBoundsException soltanto.

Questo è il codice che ho usato per scorrere l'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();
    }

Il seguente è il codice con cui io uso per copiare i dati dal ZipInputStream alla 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;

}

I 2 set di codici openCSV sono in grado di leggere alcune righe di dati, prima di lanciare tale eccezione, il che mi porta a credere che sia la ByteArray che sta causando il problema. C'è qualcosa che posso fare o risolvere questo problema? Sto cercando di fare una domanda che accetta un file zip, pur non memorizzare i file temporanei nella web app, come sto schierando sia per Google App Engine e Tomcat server.

fissi !!! Grazie a Stefano C, mi resi conto che read (byte []) non legge tutto così ho regolato il codice per rendere il copyInputStream completamente funzionale.

È stato utile?

Soluzione

Dal momento che questo appare come compiti a casa, ecco un suggerimento:

  

Il metodo read(byte[]) restituisce il numero byte letti.

Altri suggerimenti

Su quale linea si ottiene l'errore? E hai controllato il valore di size? Ho il sospetto che sia 0

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top