我有一个很小的(2-10)大文件(6-15 10),它们的压缩效果非常好(4:1)。
我正在用Java语言编写客户端和服务器,并且我希望将文件从客户端发送到服务器,这样1.客户端在发送文件时对其进行压缩(即不创建中间的.zip文件)
可能会在一个新进程中完全恢复传输
使用java.io套接字和java.util.zip ZipOutputStreams可以很容易地实现前两个目标。第三个是让我感到悲伤的那个。第四个是真正的上下文。
我猜一个解决方案可能需要部分重新传输或重新解析,以建立一个字典或其他东西。
有没有支持可恢复压缩的Java库?
发布于 2010-07-28 11:46:23
我不知道有什么能让你在流的中间恢复压缩;这看起来像是一个非常状态敏感的东西。
相反,您可以考虑将文件“分解”成较小的块,然后分别发送这些块(压缩)。比如说,100kb的块(例如)。你仍然不能在块的中间恢复,但是你可以很容易地从最近的块的开头开始。
发布于 2010-07-28 11:49:14
动态压缩是很容易的。您将遇到的问题是恢复上传。这基本上消除了HTTP作为传输的可能性,因此您需要考虑使用(S)FTP或SCP之类的东西。即使这样,问题仍然是您没有在客户机上创建文件,那么将恢复什么呢?至少,您需要使用一种确定性的压缩方法(这意味着给定一个指定的文件,压缩算法的任何两次运行都将产生完全相同的输出)。如果这不是真的,你根本就不能继续。
我的建议是采取一种稍微切题的方法。将文件划分为可管理的块(比如50MB)。这是确定性的。单独压缩每个块。如果区块失败,请重新发送它。没有恢复,但您可以通过服务器告诉客户端已接收或等待的块来获得部分上载。
您将遇到的一个问题是识别特定的文件。文件名可以吗?还有其他可识别的特征吗?如果两个客户端尝试上传相同的文件,服务器能检测到吗?这种事情的标准方法是使用校验和(文件内容的SHA1散列),但是您不希望仅仅为了执行校验和而读取整个16 do的文件。所以一些其他的方法会更好。
假设网络通信是这样的:
Client: SEND file1234 CHUNKS 167
Server: RECEIVED (already got) or WAIT 7 (chunk #)
Client: compress and send chunk 7
Server: WAIT 8
....此方法还将处理同时上传文件的多个客户端,因为服务器可以从不同的客户端请求不同的块,并将它们合并在一起。
这种方法的一个问题是,文件在服务器上并不“完整”(以zip或tarball的形式),但我认为您需要放弃这一点,才能得到真正能工作的东西,而不是代码的噩梦。
https://stackoverflow.com/questions/3349749
复制相似问题