сжатие на прямых буферах Java - PullRequest
7 голосов
/ 07 января 2012

Поток ввода-вывода gzip не работает с прямыми буферами Java.

Существует ли какая-либо реализация алгоритма сжатия, работающая непосредственно с прямыми буферами?

Таким образом, не будет никаких накладных расходов.копирования прямого буфера в байтовый массив Java для сжатия.

Ответы [ 2 ]

2 голосов
/ 12 января 2012

Я не хочу отвлекать внимание от вашего вопроса, но действительно ли это - хорошая точка оптимизации в вашей программе? Вы проверили с помощью профилировщика, что у вас действительно есть проблема? Ваш вопрос, как указано, подразумевает, что вы не проводили никаких исследований, а просто предполагаете, что у вас будут проблемы с производительностью или памятью при выделении байта []. Поскольку все ответы в этой теме, скорее всего, будут хаки, вы должны действительно убедиться, что у вас на самом деле есть проблема, прежде чем ее исправить.

Возвращаясь к вопросу, если вы хотите сжать данные «на месте» в ByteBuffer, ответ - нет, встроенной в Java возможности нет.

Если вы разместили свой буфер следующим образом:

byte[] bytes = getMyData();
ByteBuffer buf = ByteBuffer.wrap(bytes);

Вы можете отфильтровать свой байт [] через ByteBufferInputStream, как предлагалось в предыдущем ответе.

0 голосов
/ 12 января 2012

Если вы используете ByteBuffers, вы можете использовать несколько простых упаковщиков Input / OutputStream, например:

public class ByteBufferInputStream extends InputStream {

    private ByteBuffer buffer = null;

    public ByteBufferInputStream( ByteBuffer b) {
        this.buffer = b;
    }

    @Override
    public int read() throws IOException {
        return (buffer.get() & 0xFF);
    }
}

public class ByteBufferOutputStream extends OutputStream {

    private ByteBuffer buffer = null;

    public ByteBufferOutputStream( ByteBuffer b) {
        this.buffer = b;
    }

    @Override
    public void write(int b) throws IOException {
        buffer.put( (byte)(b & 0xFF) );
    }

}

Тест:

ByteBuffer buffer = ByteBuffer.allocate( 1000 );
ByteBufferOutputStream bufferOutput = new ByteBufferOutputStream( buffer );
GZIPOutputStream output = new GZIPOutputStream( bufferOutput );
output.write("stackexchange".getBytes());
output.close();

buffer.position( 0 );

byte[] result = new byte[ 1000 ];

ByteBufferInputStream bufferInput = new ByteBufferInputStream( buffer );
GZIPInputStream input = new GZIPInputStream( bufferInput );
input.read( result );

System.out.println( new String(result));
...