【发布时间】: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 功能齐全。
【问题讨论】:
-
这对我来说像是家庭作业。