Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compressing and decompressing streams

I found this article about simple proxy server implemented in JAVA:

http://www.java2s.com/Code/Java/Network-Protocol/Asimpleproxyserver.htm

The code simply gets some stream from the client, after sends it to the server and after it gets stream from the server and sends the response to the client. What I would like to do is to compress this streams before it is sent and decompress after it is received.

I found the class GZIPInputStream but I'm not sure how to use it and what I found on internet didn't help me. I either didn't understand that so much or it was not a good solution for me.

My idea is too that but I'm not sure if its ok:

final InputStream streamFromClient = client.getInputStream();
final OutputStream streamToClient = client.getOutputStream();
final InputStream streamFromServer = server.getInputStream();
final OutputStream streamToServer = server.getOutputStream();

InputStream gzipStream = new GZIPInputStream(streamFromClient );
try
{
        while ((bytesRead = gzipStream.read(request)) != -1)
       {
                    streamToServer.write(request, 0, bytesRead);
                    streamToServer.flush();
        }
}
catch (Exception e) {
System.out.println(e);
}

Now the data sent to the server should be compressed before sending (but I'm not sure if it's a correct solution). IS IT?

Now imagine the server sends me the compressed data. So this stream:

final InputStream streamFromServer = server.getInputStream();

is compressed.

How can I decompress it and write to the

final OutputStream streamToClient = client.getOutputStream();

Thanks for the help, guys!

like image 778
Milan Novotný Avatar asked Nov 18 '11 21:11

Milan Novotný


People also ask

What is compressing and decompressing?

What is compression and decompression? Compression reduces the size of an application or document for storage or transmission. Compressed files are smaller, download faster, and easier to transport. Decompression or expansion restores the document or application to its original size.

What is streaming compression?

All streaming codecs use what's called “lossy” compression, which means the more you compress, the more quality you lose. For this reason, all other file characteristics (like resolution, frame rate or codec) being equal, the lower the data rate, the lower the quality of the compressed file.

Is it faster to compress or decompress?

It is only faster if you only leave one commpressed file in compressed format on external file. But if you decompress file on the same hard, it will be slow.

Is compression slower than decompression?

Dictionary-based compression The decompression algorithm decides whether the next character is a 'real' index or a raw symbol, this depends on the first component of the token. If the first is a 0, the next character is a raw symbol. 2. The algorithm is asymmetric since compression is slower than decompression.


1 Answers

Read the javadoc of these streams : http://download.oracle.com/javase/6/docs/api/java/util/zip/GZIPInputStream.html and http://download.oracle.com/javase/6/docs/api/java/util/zip/GZIPOutputStream.html.

GZIPOutputStream compresses the bytes you write into it before sending them to the wrapped output stream. GZIPInputStream reads compressed bytes from the wrapped stream and returns uncompressed bytes.

So, if you want to send compressed bytes to anyone, you must write to a GZIPOutputStream. But of course, this will only work if the receiving end knows it and decompresses the bytes it receives.

Similarly, if you want to read compressed bytes, you need to read them from a GZIPInputSTream. But of course, it'll only work if the bytes are indeed compressed using the same algorithm by the sending end.

like image 105
JB Nizet Avatar answered Oct 06 '22 09:10

JB Nizet