使用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仅能够读取这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应用程序中,因为我同时部署到了Google App Engine和tomcat服务器。
固定!!!多亏了斯蒂芬C,我意识到read(byte [])并不能读取所有内容,因此我调整了代码以使copyInputStream完全起作用。
最佳答案
由于这看起来像是作业,因此有一个提示:
read(byte[])
方法返回读取的字节数。