2010-10-17 5 views
0

Je reçois une exception java.lang.ArrayIndexOutOfBoundsException lors de l'utilisation de ByteArrayInputStream.Aide! java.lang.ArrayIndexOutOfBoundsException inattendue lors de l'utilisation de ByteArrayInputStream

Premièrement, j'utilise un ZipInputStream pour lire un fichier compressé, et tout en boucle à travers les zipEntries, J'utilise un ByteArrayInputStream pour capturer les données de chaque ZipEntry utilisant le ZipInputStream.read (byte [] b) et ByteArrayInputStream (byte [] b) méthodes. À la fin, j'ai un total de 6 objets ByteArrayInputStream différents contenant des données de 6 entrées zip différentes. J'utilise ensuite OpenCSV pour lire chacun des ByteArrayInputStream.

Je n'ai aucun problème de lecture 4 des 6 objets ByteArrayInputStream, dont ont des tailles d'octets de moins de 2000.

Les 2 autres objets ByteArrayInputStream ont des tailles d'octets de 2155 et 4010 respectivement, et la CSVReader n'a pu lisez une partie de ces 2 objets, puis donnez une exception java.lang.ArrayIndexOutOfBoundsException.

Ceci est le code I utilisé pour la boucle à travers 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(); 
    } 

Ce qui suit est le code dont j'utilise pour copier les données de la ZipInputStream au 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; 

} 

Les 2 séries de codes openCSV sont capables de lire quelques lignes de données, avant de lancer cette exception, ce qui me porte à croire qu'il est le byteArray qui est l'origine du problème. Y a-t-il quelque chose que je puisse faire ou contourner ce problème? J'essaie de faire une application qui accepte un fichier zip, sans stocker de fichiers temporaires dans l'application web, car je suis en train de déployer à la fois google app engine et tomcat server.

Fixé !!! Merci à stephen C, j'ai réalisé que read (byte []) ne lit pas tout alors j'ai ajusté le code pour rendre le copyInputStream pleinement fonctionnel.

+0

Cela ressemble à des devoirs pour moi. –

Répondre

1

Depuis cela ressemble à des devoirs, voici un indice:

La méthode read(byte[]) renvoie le nombre d'octets lus.

+0

ahhhh tu as raison. les tableaux de 2 octets avec lesquels j'ai un problème ne lisent pas le flux d'entrées complet, il semble. travaillera à résoudre ce problème –

0

Sur quelle ligne obtenez-vous l'erreur? Et avez-vous vérifié la valeur de size? Je pense qu'il est 0

+0

salut, je reçois l'erreur sur le code OpenCsv que j'utilise pour lire byteArray. Les tailles ne sont pas 0, elles sont comme suit pour les 6 byteArrays différents: 125,655,90,1137,2155,4010. Les derniers tableaux à 2 octets sont ceux qui donnent l'exception indexOutOfBoundsException. Ils sont capables de lire une partie du byteArray avant de donner cette Exception, ce qui m'amène à croire que ce n'est pas une erreur dans le code OpenCSV, mais une erreur dans le ByteArrayInputStream –

Questions connexes