开发者

Help! unexpected java.lang.ArrayIndexOutOfBoundsException when using ByteArrayInputStream

开发者 https://www.devze.com 2023-01-20 02:57 出处:网络
I get a java.lang.ArrayIndexOutOfBoundsException when using ByteArrayInputStream. First, I use a ZipInputStream to read through a zip file,

I get a java.lang.ArrayIndexOutOfBoundsException when using ByteArrayInputStream.

First, I use a ZipInputStream to read through a zip file, and while looping through the zipEntries, I use a ByteArrayInputStream to capture the data of each zipEntry using the ZipInputStream.read(byte[] b) and ByteArrayInputStream(byte[] b) methods.

At the end, I have a total of 6 different ByteArrayInputStream objects containing data from 6 different zipEntries. I then use OpenCSV to read through each of the ByteArrayInputStream.

I have no problem reading 4 of the 6 ByteArrayInputStream objects, of which have byte sizes of less than 2000.

The other 2 ByteArrayInputStream objects have byte sizes of 2155 and 4010 respectively and the CSVreader was only able to read part of these 2 objects, then give an java.lang.ArrayIndexOutOfBoundsException.

This is the code I used to loop through the 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();
    }

The following is the code with which I use to copy the data from the ZipInputStream to the 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;

}

The 2 sets of openCSV codes are able to read a few lines of data, before throwing that exception, which leads me to believe that it is the byteArray that is causing the problem. Is there anything I can do or work around this problem? I am trying to make an application that accepts a zip file, while not storing any t开发者_运维百科emporary files in the web app, as I am deploying to both google app engine and tomcat server.

Fixed!!! Thanks to stephen C, i realized that read(byte[]) does not read everything so I adjusted the code to make the copyInputStream fully functional.


Since this looks like homework, here's a hint:

The read(byte[]) method returns the number bytes read.


On what line do you get the error? And have you checked the value of size? I suspect it's 0

0

精彩评论

暂无评论...
验证码 换一张
取 消