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);
}
}