3

deflaterstreamによって「ストリームの終わりを超えて書き込む」エラーが発生します。エラーを追跡したところ、ストリームがすでに終了していることがわかりました。ただし、私の関数の最初は、ストリームを新しいものとして作成し、最後にcloseまたはfinishを呼び出さないでください。

エラー:

SEVERE: null
java.io.IOException: write beyond end of stream
    at java.util.zip.DeflaterOutputStream.write(DeflaterOutputStream.java:102)
    at evidence.SaveStateManager.saveIncremental(SaveStateManager.java:82)

コード:

public static void saveIncremental(int textureId, int layer, int shot) {
    try {
        bOut = new FileOutputStream("saves/p-" + layer + "-" + shot + ".gz");
        gzipOut = new DeflaterOutputStream (bOut, deflater);

        glPushAttrib(GL_ALL_ATTRIB_BITS);

        glBindTexture(GL_TEXTURE_2D, textureId);

        int bpp = 4; 
        ByteBuffer buffer = BufferUtils.createByteBuffer(SAVE_WIDTH * SAVE_HEIGHT * bpp);
        glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer );

        byte[] bytes = new byte[1024];
        while (buffer.hasRemaining()) {
            int len = Math.min(buffer.remaining(), bytes.length);
            buffer.get(bytes, 0, len);
            try {
                gzipOut.write(bytes, 0, len);
            } catch (IOException ex) {
                Logger.getLogger(SaveStateManager.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        glBindTexture(GL_TEXTURE_2D, 0);
        glPopAttrib();

        gzipOut.finish();
        gzipOut.close();
        bOut.close();
    } catch (Exception ex) {
        Logger.getLogger(SaveStateManager.class.getName()).log(Level.SEVERE, null, ex);
    }
}
4

1 に答える 1

10

デフレーターはステートフルであり、あなたはそれを再利用しています。

gzipOut = new DeflaterOutputStream (bOut, deflater);

DeflaterOutputStreamのソースから

public void write(byte[] b, int off, int len) throws IOException {
    if (def.finished()) {
        throw new IOException("write beyond end of stream");
于 2013-01-09T14:33:51.973 に答える