Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
In meiner Applikation habe ich einen ByteArray diesen muss ich nun über UDP Senden, soweit kein Problem. Allerdings möchte ich die Daten vor dem Senden GZip komprimieren. Eine möglichkeit ist über einen GZIPOutputStream in einen File zu speichern und diesen dann wieder zu laden, allerdings würde ich das ganze gerne im Programm machen (also ohne irgendeinen zwischenspeicher auf der Festplatte) also einfach im Programm eine komprimierte Version des ByteArrays bekommen.
GZIPOutputStream heißt nicht GZIPFileOutputStream weil man einen beliebigen OutputStream übergeben kann,
z.B. einen ByteArrayOutputStream, der am Ende ein byte[] erzeugt
Ich hab jetzt mal ne QuickAndDirty Lösung zum dekomprimieren, allerdings funktioniert diese nicht soll heißen die dekomprimierten Daten entsprechen nicht den Daten vor der Kompression.
Hat jemand Ideen?
LG Hemeroc
Java:
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
public class myGZIPDecode extends GZIPInputStream {
private byte[] buff = new byte[10000];
private byte[] out = new byte[10000000];
public myGZIPDecode( final byte[] rawBytes) throws IOException{
super(new ByteArrayInputStream(rawBytes));
int i;
int ges = 0;
while(available() > 0){
i = read(buff);
if(i == -1){
break;
}
ges += i;
System.arraycopy(buff, 0, out, ges, i);
}
close();
}
public byte [] getUncompressedBytes() {
return out;
}
}
Der out-Buffer behält seine feste Größe, auch wenn er nicht bis zum Ende gefüllt wird. Insofern wird man - sebst wenn die Dekompression funktioniert - normalerweise nicht die ursprünglichen Daten bekommen, sondern ein mit lauter Nullen "aufgefülltes" Array.
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
public class myGZIPEncode extends GZIPOutputStream {
public myGZIPEncode( final byte[] rawBytes) throws IOException{
super( new ByteArrayOutputStream(), rawBytes.length);
def.setLevel(9);
write( rawBytes, 0, rawBytes.length);
close();
}
public byte [] getCompressedBytes() {
return ((ByteArrayOutputStream)out).toByteArray();
}
}
hier die (leicht geänderte) Decode
Java:
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
public class myGZIPDecode extends GZIPInputStream {
private byte[] buff = new byte[10000];
private byte[] out = new byte[10000000];
private int ges = 0;
private byte[] end;
public myGZIPDecode( final byte[] rawBytes) throws IOException{
super(new ByteArrayInputStream(rawBytes));
int i;
while(available() > 0){
i = read(buff);
if(i == -1){
break;
}
ges += i;
System.arraycopy(buff, 0, out, ges, i);
}
close();
}
public byte [] getUncompressedBytes() {
if(end == null){
end = new byte[ges];
System.arraycopy(out, 0, end, 0, ges);
}
return end;
}
public int getByteCount(){
return ges;
}
}
und ein JUnit dazu.. (das teil sollte natürlich generell byte[] komprimieren können, String ist nur zum anschauen des ergebnisses verwendet worden)
Java:
import java.io.IOException;
import junit.framework.Assert;
import org.junit.Test;
public class UnitTest {
myGZIPDecode decoder;
myGZIPEncode encoder;
@Test
public void test1(){
String testString = "hi this is a testString :)";
byte[] testbyte = testString.getBytes();
String a;
try {
encoder = new myGZIPEncode(testbyte);
decoder = new myGZIPDecode(encoder.getCompressedBytes());
a = new String(decoder.getUncompressedBytes());
Assert.assertEquals(testString, a);
} catch (IOException e) {
e.printStackTrace();
}
}
}
nach dem encoden und decoden kommen lauter lustige kästchen heraus, vermutlich null, 0, oder andere nicht-druckbare zeichen...
das interessante ist allerdings, dass testString.length und decoder.getByteCount das gleiche zurückgeben... also anscheinend macht der schon irgendwas richtig, nur nicht eben komplett richtig
jemand ne idee?
@Murray, daran hab ich auch schon gedacht, daher hab ich auch ein neues byte[] angelegt, der wirklich nur so groß ist, wie dekomprimiert...