Помогите!неожиданное исключение java.lang.ArrayIndexOutOfBoundsException при использовании ByteArrayInputStream - PullRequest
0 голосов
/ 17 октября 2010

Я получаю исключение java.lang.ArrayIndexOutOfBoundsException при использовании ByteArrayInputStream.

Во-первых, я использую ZipInputStream для чтения через zip-файл, и пока я зацикливаю zipEntries, я использую ByteArrayInputStream для захвата данных каждого zipEntry с использованием ZipInputStream.read (byte [] b) и ByteArrayInputStream(byte [] b) методов.

В итоге у меня есть всего 6 различных объектов ByteArrayInputStream, содержащих данные из 6 различных zipEntries.Затем я использую OpenCSV для чтения каждого из ByteArrayInputStream.

У меня нет проблем с чтением 4 из 6 объектов ByteArrayInputStream, у которых размеры байтов меньше 2000.

Другие 2 объекта ByteArrayInputStream имеют размеры байтов 2155 и 4010 соответственно и CSVreaderбыл в состоянии прочитать только часть этих 2 объектов, а затем дать java.lang.ArrayIndexOutOfBoundsException.

Это код, который я использовал для циклического прохождения 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();
    }

Ниже приведенкод, с помощью которого я копирую данные из ZipInputStream в 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;

}

2 набора кодов openCSV способны прочитать несколько строк данных, прежде чем выдать это исключение, что приводит меня кПолагайте, что проблема связана с byteArray.Могу ли я что-нибудь сделать или обойти эту проблему?Я пытаюсь создать приложение, которое принимает zip-файл, но не хранит временные файлы в веб-приложении, так как я развертываю их как на google app engine, так и на сервере tomcat.

Исправлено !!!Благодаря Стивену С я понял, что read (byte []) не читает все, поэтому я изменил код, чтобы сделать copyInputStream полностью функциональным.

Ответы [ 2 ]

1 голос
/ 17 октября 2010

Так как это выглядит как домашнее задание, вот подсказка:

Метод read(byte[]) возвращает количество прочитанных байтов.

0 голосов
/ 17 октября 2010

На какой строке вы получаете сообщение об ошибке?А вы проверили значение size?Я подозреваю, что это 0

...