如何从远程存档文件中提取单个文件?

Oak*_*Oak 11 java extract download tar archive

特定

  1. 存档的URL(例如zip文件)
  2. 该存档内文件的全名(包括路径)

我正在寻找一种方法(最好是在Java中)来创建该文件的本地副本,而无需先下载整个存档.

从我(有限的)理解应该是可能的,虽然我不知道如何做到这一点.我一直在使用TrueZip,因为它似乎支持各种各样的存档类型,但我对它以这种方式工作的能力存有疑虑.有没有人有这种经历?

编辑:能够用tarball和压缩的tarball做到这一点对我来说也很重要.

Dav*_*d Z 10

那么,至少,您必须下载存档的部分,包括要提取的文件的压缩数据.这表明了以下解决方案:打开URLConnection存档,获取其输入流,将其包装在一个中ZipInputStream,然后重复调用getNextEntry()closeEntry()遍历文件中的所有条目,直到找到所需的条目.然后你可以使用它来读取它的数据ZipInputStream.read(...).

Java代码看起来像这样:

URL url = new URL("http://example.com/path/to/archive");
ZipInputStream zin = new ZipInputStream(url.getInputStream());
ZipEntry ze = zin.getNextEntry();
while (!ze.getName().equals(pathToFile)) {
    zin.closeEntry(); // not sure whether this is necessary
    ze = zin.getNextEntry();
}
byte[] bytes = new byte[ze.getSize()];
zin.read(bytes);
Run Code Online (Sandbox Code Playgroud)

当然,这是未经测试的.

  • 好吧,为什么你认为它叫做`ZipInputStream`?;-)如果你环顾互联网,你可能会找到一个你可以大致采用相同方式的"TarInputStream" - 如果没有,你可以编写自己的.这很简单,因为tar文件没有被压缩,它基本上只是每个文件的标题,后跟文件数据.(维基百科有格式描述)对于gzipped tar档案,Java的标准库有一个'GZIPInputStream`,你可以和tar流一起使用. (3认同)

Ada*_*ume 5

与此处的其他答案相反,我想指出ZIP条目是单独压缩的,因此(理论上)您不需要下载除目录和条目本身之外的任何内容.服务器需要支持RangeHTTP标头才能工作.

标准Java API仅支持从本地文件和输入流中读取ZIP文件.据我所知,没有从随机访问远程文件中读取的规定.

由于您使用的是TrueZip,我建议de.schlichtherle.io.rof.ReadOnlyFile使用Apache HTTP Client 实现并使用它创建de.schlichtherle.util.zip.ZipFile.

这不会为压缩的TAR存档提供任何优势,因为整个存档被压缩在一起(除了使用InputStream并在您输入时将其终止).