Aiuto! java.lang.ArrayIndexOutOfBoundsException inaspettata quando si utilizza ByteArrayInputStream
-
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.
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