使用 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 功能齐全。