使用ByteArrayInputStream时出现java.lang.ArrayIndexOutOfBoundsException。

首先,我使用ZipInputStream读取zip文件,
在遍历zipEntries的同时,
我使用ByteArrayInputStream捕获每个zipEntry的数据
使用
ZipInputStream.read(byte [] b)和ByteArrayInputStream(byte [] b)方法。

最后,我总共有6个不同的ByteArrayInputStream对象,其中包含来自6个不同zipEntries的数据。
然后,我使用OpenCSV来读取每个ByteArrayInputStream。

我没有问题读取6个ByteArrayInputStream对象中的4个,这些对象的字节大小小于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;

}


在抛出该异常之前,这两组openCSV代码能够读取几行数据,这使我相信是byteArray引起了问题。有什么办法可以解决我的问题?
我正在尝试制作一个接受zip文件的应用程序,同时不将任何临时文件存储在Web应用程序中,因为我同时部署到了Google App Engine和tomcat服务器。

固定!!!多亏了斯蒂芬C,我意识到read(byte [])并不能读取所有内容,因此我调整了代码以使copyInputStream完全起作用。

最佳答案

由于这看起来像是作业,因此有一个提示:


read(byte[])方法返回读取的字节数。

10-08 01:50