0

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

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

最后,我总共有 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 应用程序中存储任何临时文件,因为我正在部署到谷歌应用程序引擎和 tomcat 服务器。

固定的!!!感谢 stephen C,我意识到 read(byte[]) 不会读取所有内容,因此我调整了代码以使 copyInputStream 功能齐全。

4

2 回答 2

1

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

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

于 2010-10-17T15:18:58.363 回答
0

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

于 2010-10-17T13:36:35.533 回答