-
Enhancement
-
Resolution: Fixed
-
P4
-
11
-
b11
-
x86
-
windows_xp
A DESCRIPTION OF THE REQUEST :
The Inflater class' methods - setInput() and inflate() - take byte arrays, but not ByteBuffers.
They need to take ByteBuffers.
JUSTIFICATION :
The new java.nio.* API is nice and uses ByteBuffers, which I've been told are more efficent, and are definitely easier to work with than getting integers from byte arrays. Inflater and Deflater should use ByteBuffers to avoid having to convert back and forth when compressing data to send over the internet.
Also, I think this would be an easy fix. Wrapping doesn't cut it.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Inflater class taking ByteBuffers
int len = sockechannel.read(bytebuffer);
inflater.setInput(bytebuffer, 0 , len);
inflater.inflate(bytebuffer); //if this has to use a seperate ByteBuffer that's fine too
ACTUAL -
Lots of conversions
int len = socketchannel.read(bytebuffer);
byte[] temp = byte[len];
bytebuffer.get(temp);
inflater.setInput(temp,0,len);
byte [] temp2 = byte[len*10];
len = inflater.inflate(temp2);
bytebuffer.put(temp2, 0 , len);
---------- BEGIN SOURCE ----------
/*
it really doesn't matter what i put since it would take pages to actually
connect to the real server. If you really need this to understand my
issue, email me and ill send you whatever you need.
*/
import java.util.zip.*;
import java.nio.*;
import java.nio.channels.SocketChannel;
import java.io.IOException;
public class SocketGold extends Thread
{
ByteBuffer lenBytes;
SocketChannel socket;
Inflater compresseur;
byte[] gonflé;
public SocketGold(SocketChannel sc)
{
socket = sc;
lenBytes = ByteBuffer.allocateDirect(2);
compresseur = new Inflater();
gonflé = new byte[1536];
}
//disregard this, it just makes the important code easier for the eyes
private int read(ByteBuffer buf)
{
try {
return socket.read(buf);
}
catch(IOException e) {
System.exit(1);
}
return -1;
}
public void run()
{
short len;
int résultat=0;
byte[] temp;
ByteBuffer tempBuffer;
while (true) {
read(lenBytes);
len = lenBytes.getShort();
tempBuffer = ByteBuffer.allocateDirect(len);
//example of good behavior
read(tempBuffer);
//i disagree with this method
temp = new byte[len];
tempBuffer.get(temp);
compresseur.setInput(temp,0,len);
try {
résultat = compresseur.inflate(gonflé);
} catch(DataFormatException e) {
System.exit(1);
}
//this is also annoying
tempBuffer = ByteBuffer.allocateDirect(résultat);
tempBuffer.put(gonflé,0,résultat);
}
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
I'm using byte arrays.
The Inflater class' methods - setInput() and inflate() - take byte arrays, but not ByteBuffers.
They need to take ByteBuffers.
JUSTIFICATION :
The new java.nio.* API is nice and uses ByteBuffers, which I've been told are more efficent, and are definitely easier to work with than getting integers from byte arrays. Inflater and Deflater should use ByteBuffers to avoid having to convert back and forth when compressing data to send over the internet.
Also, I think this would be an easy fix. Wrapping doesn't cut it.
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Inflater class taking ByteBuffers
int len = sockechannel.read(bytebuffer);
inflater.setInput(bytebuffer, 0 , len);
inflater.inflate(bytebuffer); //if this has to use a seperate ByteBuffer that's fine too
ACTUAL -
Lots of conversions
int len = socketchannel.read(bytebuffer);
byte[] temp = byte[len];
bytebuffer.get(temp);
inflater.setInput(temp,0,len);
byte [] temp2 = byte[len*10];
len = inflater.inflate(temp2);
bytebuffer.put(temp2, 0 , len);
---------- BEGIN SOURCE ----------
/*
it really doesn't matter what i put since it would take pages to actually
connect to the real server. If you really need this to understand my
issue, email me and ill send you whatever you need.
*/
import java.util.zip.*;
import java.nio.*;
import java.nio.channels.SocketChannel;
import java.io.IOException;
public class SocketGold extends Thread
{
ByteBuffer lenBytes;
SocketChannel socket;
Inflater compresseur;
byte[] gonflé;
public SocketGold(SocketChannel sc)
{
socket = sc;
lenBytes = ByteBuffer.allocateDirect(2);
compresseur = new Inflater();
gonflé = new byte[1536];
}
//disregard this, it just makes the important code easier for the eyes
private int read(ByteBuffer buf)
{
try {
return socket.read(buf);
}
catch(IOException e) {
System.exit(1);
}
return -1;
}
public void run()
{
short len;
int résultat=0;
byte[] temp;
ByteBuffer tempBuffer;
while (true) {
read(lenBytes);
len = lenBytes.getShort();
tempBuffer = ByteBuffer.allocateDirect(len);
//example of good behavior
read(tempBuffer);
//i disagree with this method
temp = new byte[len];
tempBuffer.get(temp);
compresseur.setInput(temp,0,len);
try {
résultat = compresseur.inflate(gonflé);
} catch(DataFormatException e) {
System.exit(1);
}
//this is also annoying
tempBuffer = ByteBuffer.allocateDirect(résultat);
tempBuffer.put(gonflé,0,résultat);
}
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
I'm using byte arrays.
- csr for
-
JDK-8200527 Inflater/Deflater methods to inflate/deflate on byte buffers
- Closed
- relates to
-
JDK-8231770 Test java/util/zip/FlaterTest.java fails with -Xcheck:jni
- Closed