压缩和解压流

9

我找到了一篇关于JAVA实现简单代理服务器的文章:

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

这段代码从客户端获取一些流,然后将其发送到服务器,接着从服务器获取流并将响应发送给客户端。我想要做的是在发送前压缩这些流,在接收后解压缩。
我找到了GZIPInputStream类,但我不确定如何使用它,而且我在网上找到的资料没有帮助我。我或者没有完全理解,或者这不是适合我的好方法。
我的想法也是这样做,但我不确定是否可行:
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);
}

现在发送到服务器的数据应该在发送之前进行压缩(但我不确定这是否是正确的解决方案)。是吗?
现在想象一下,服务器向我发送压缩后的数据。 因此,这个流:
final InputStream streamFromServer = server.getInputStream();

这是压缩过的。

如何解压并写入到

final OutputStream streamToClient = client.getOutputStream();

谢谢帮忙,大家!


跨帖:java-forums.org -- 压缩解压流 - Hovercraft Full Of Eels
1个回答

10

阅读这些流的javadoc: http://download.oracle.com/javase/6/docs/api/java/util/zip/GZIPInputStream.htmlhttp://download.oracle.com/javase/6/docs/api/java/util/zip/GZIPOutputStream.html

GZIPOutputStream 将您写入其中的字节进行压缩,然后将其发送到包装的输出流。 GZIPInputStream 从包装的流中读取压缩字节并返回未压缩字节。

因此,如果您想将压缩字节发送给任何人,必须写入 GZIPOutputStream。但是,这只有在接收端知道并解压接收到的字节时才有效。

类似地,如果您想读取压缩字节,您需要从 GZIPInputStream 中读取它们。但是,它只会在发送端使用相同算法压缩字节时才有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接