2

JarInputStream (JAR ファイルを含むバイト配列から構築) があり、そこから特定のファイルを読み取りたいと考えています。そのため、含まれている ZipEntries を繰り返し処理し、ファイルを検索します。次に、ファイルをバイト配列に書き込もうとします。

ただし、ファイルはどういうわけか完全に読み取られていません。ファイルシステムに書き込んでテキストエディターで開くと、正しく読み取られた最初の数行の後にNULLが含まれています。

コードは次のようになります。

JarInputStream is = new JarInputStream(new ByteArrayInputStream(_jarFile));
ZipEntry entry = is.getNextEntry();
while (entry != null) {                 
    if (entry.getName().endsWith(".xyz")) {
        // read the *.xyz file and load it into a byte array
        int size = (int) entry.getSize();
        byte[] _xyzFile = new byte[size];
        is.read(_xyzFile, 0, size);
        break;
    }
    entry = is.getNextEntry();
}

is.close();

変数にはsize間違いなく正しいバイト数が含まれているため、ほんの数行で読み取りが停止する理由がわかりません。

4

1 に答える 1

5

is.read(_xyzFile, 0, size);必ずしもsizeバイトを配列に読み込むわけではありませんが、バイトまで読み込みsizeます。このメソッドは、読み取られた実際のバイト数を返します。

ループを実装してis.read数回呼び出すか、そのような機能を提供するユーティリティ ライブラリ ( IOUtils.toByteArray(InputStream)Apache Commons-IO など) を使用する必要があります。

于 2012-08-21T09:32:12.620 に答える