【问题标题】:Help! unexpected java.lang.ArrayIndexOutOfBoundsException when using ByteArrayInputStream帮助!使用 ByteArrayInputStream 时出现意外的 java.lang.ArrayIndexOutOfBoundsException
【发布时间】:2010-10-17 13:27:24
【问题描述】:

使用 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 只能读取这两个对象的一部分,然后给出 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 文件的应用程序,而不是在网络应用程序中存储任何临时文件,因为我正在部署到谷歌应用程序引擎和 tomcat 服务器。

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

【问题讨论】:

  • 这对我来说像是家庭作业。

标签: java bytearrayinputstream


【解决方案1】:

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

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

【讨论】:

  • 啊,你是对的。我遇到问题的 2 字节数组似乎没有读取完整的输入流。将努力解决这个问题
【解决方案2】:

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

【讨论】:

  • 嗨,我在用于读取 byteArray 的 OpenCsv 代码上遇到错误。大小不是 0,对于 6 个不同的 byteArray,它们如下所示:125,655,90,1137,2155,4010。最后 2 字节数组是给出 indexOutOfBoundsException 的数组。他们能够在给出异常之前读取部分 byteArray,这让我相信这不是 OpenCSV 代码中的错误,而是 ByteArrayInputStream 中的错误
猜你喜欢
  • 1970-01-01
  • 2021-09-28
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
相关资源
最近更新 更多