救命!使用ByteArrayInputStream时出现意外的java.lang.ArrayIndexOutOfBoundsException

时间:2010-10-17 13:27:25

标签: java bytearrayinputstream

使用ByteArrayInputStream时,我得到了java.lang.ArrayIndexOutOfBoundsException。

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

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

我在读取6个字节大小小于2000的ByteArrayInputStream对象中没有问题。

其他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文件的应用程序,而不是在Web应用程序中存储任何临时文件,因为我正在部署到谷歌应用程序引擎和tomcat服务器。

固定!!!感谢stephen C,我意识到read(byte [])没有读取所有内容所以我调整了代码以使copyInputStream完全正常运行。

2 个答案:

答案 0 :(得分:1)

由于这看起来像家庭作业,这里有一个提示:

  

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

答案 1 :(得分:0)

你在哪一行得到错误?你检查了size的价值吗?我怀疑它是0