0

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 が完全に機能するようにコードを調整しました。

4

2 に答える 2

1

これは宿題のように見えるので、ここにヒントがあります。

このread(byte[])メソッドは、読み取ったバイト数を返します。

于 2010-10-17T15:18:58.363 に答える
0

どの行でエラーが発生しますか? の値を確認しましたsizeか? 0だと思います

于 2010-10-17T13:36:35.533 に答える