首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java恢复失败的压缩

使用Java恢复失败的压缩
EN

Stack Overflow用户
提问于 2010-07-28 11:40:30
回答 2查看 212关注 0票数 2

我有一个很小的(2-10)大文件(6-15 10),它们的压缩效果非常好(4:1)。

我正在用Java语言编写客户端和服务器,并且我希望将文件从客户端发送到服务器,这样1.客户端在发送文件时对其进行压缩(即不创建中间的.zip文件)

  1. 服务器上的压缩内容最终会以格式正确的文件(例如.zip或.tgz文件)的形式出现,因此可以按原样下载。
  2. 如果在
  3. 中途失败,则可以恢复传输

可能会在一个新进程中完全恢复传输

使用java.io套接字和java.util.zip ZipOutputStreams可以很容易地实现前两个目标。第三个是让我感到悲伤的那个。第四个是真正的上下文。

我猜一个解决方案可能需要部分重新传输或重新解析,以建立一个字典或其他东西。

有没有支持可恢复压缩的Java库?

EN

回答 2

Stack Overflow用户

发布于 2010-07-28 11:46:23

我不知道有什么能让你在流的中间恢复压缩;这看起来像是一个非常状态敏感的东西。

相反,您可以考虑将文件“分解”成较小的块,然后分别发送这些块(压缩)。比如说,100kb的块(例如)。你仍然不能在块的中间恢复,但是你可以很容易地从最近的块的开头开始。

票数 0
EN

Stack Overflow用户

发布于 2010-07-28 11:49:14

动态压缩是很容易的。您将遇到的问题是恢复上传。这基本上消除了HTTP作为传输的可能性,因此您需要考虑使用(S)FTP或SCP之类的东西。即使这样,问题仍然是您没有在客户机上创建文件,那么将恢复什么呢?至少,您需要使用一种确定性的压缩方法(这意味着给定一个指定的文件,压缩算法的任何两次运行都将产生完全相同的输出)。如果这不是真的,你根本就不能继续。

我的建议是采取一种稍微切题的方法。将文件划分为可管理的块(比如50MB)。这是确定性的。单独压缩每个块。如果区块失败,请重新发送它。没有恢复,但您可以通过服务器告诉客户端已接收或等待的块来获得部分上载。

您将遇到的一个问题是识别特定的文件。文件名可以吗?还有其他可识别的特征吗?如果两个客户端尝试上传相同的文件,服务器能检测到吗?这种事情的标准方法是使用校验和(文件内容的SHA1散列),但是您不希望仅仅为了执行校验和而读取整个16 do的文件。所以一些其他的方法会更好。

假设网络通信是这样的:

代码语言:javascript
复制
Client: SEND file1234 CHUNKS 167
Server: RECEIVED (already got) or WAIT 7 (chunk #)
Client: compress and send chunk 7
Server: WAIT 8
....

此方法还将处理同时上传文件的多个客户端,因为服务器可以从不同的客户端请求不同的块,并将它们合并在一起。

这种方法的一个问题是,文件在服务器上并不“完整”(以zip或tarball的形式),但我认为您需要放弃这一点,才能得到真正能工作的东西,而不是代码的噩梦。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3349749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档