ByteArrayInputStream を使用すると、java.lang.ArrayIndexOutOfBoundsException が発生します。
まず、ZipInputStream を使用して zip ファイルを読み取り、zipEntries をループしながら、ByteArrayInputStream を使用して、ZipInputStream.read(byte[] b) と ByteArrayInputStream(byte[] b) を使用して各 zipEntry のデータをキャプチャします。メソッド。
最後に、6 つの異なる zipEntries からのデータを含む合計 6 つの異なる ByteArrayInputStream オブジェクトがあります。次に、OpenCSV を使用して、それぞれの ByteArrayInputStream を読み取ります。
バイト サイズが 2000 未満の 6 つの ByteArrayInputStream オブジェクトのうち 4 つを問題なく読み取ることができます。
他の 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;
}
2 セットの openCSV コードは、その例外をスローする前に数行のデータを読み取ることができるため、問題の原因は byteArray であると思われます。この問題を回避するためにできることはありますか? Google App Engine と Tomcat サーバーの両方にデプロイしているため、Web アプリに一時ファイルを保存せずに、zip ファイルを受け入れるアプリケーションを作成しようとしています。
修理済み!!!stephen C のおかげで、read(byte[]) がすべてを読み取らないことに気付いたので、copyInputStream が完全に機能するようにコードを調整しました。