在安卓系统中从包含多个文件的.zip文件中解压单个文件

4

我想从一个非常大的zip压缩文件中获取一个特定的文件(我知道它的名称)。这个压缩文件包含约100000个文件,因为我不想在循环中查找我的文件。我认为必须有一些解决方案来解决这种情况,类似于Linux上的命令。

unzip archive.zip myfile.txt

我写了以下代码
try  { 
   FileInputStream fin = new FileInputStream(rootDir+"/archive.zip"); 
   ZipInputStream zin = new ZipInputStream(fin); 
   ZipEntry ze = new ZipEntry("myfile.txt");

   FileOutputStream fout = new FileOutputStream(rootDir+"/buff/" + ze.getName());
   for (int c = zin.read(); c != -1; c = zin.read()) { 
      fout.write(c); 
   } 

   zin.closeEntry(); 
   fout.close(); 
   zin.close();

} catch(Exception e) { 
   Log.e("Decompress", "unzip", e); 
}

这段代码在buff目录中创建了一个新文件,但是这个文件是空的!请帮我解决这个问题!谢谢您抽出时间帮助!
1个回答

3
我对Java还比较新,但API文档包含了相当数量的标准Java库信息,包括java.util.zip。从这里进入ZipFile Entry,你可以滚动到方法列表,找到一个叫做getEntry的方法。这似乎是你应该开始的路线! 编辑:请注意,您在调用时可能需要包含目录(例如:“dir \ subdirF \ subdirW \ FileThatYouWant.txt”),因为这似乎是一个一个地命名文件的方式。 编辑2:如果您愿意阅读一点内容,这里提供了大量信息:使用Java API压缩和解压缩数据。受内存限制的影响,您唯一合理的解决方案可能是使用ZipInputStream对象,该对象需要您逐个步进归档中的每个ZipEntry(平均约50,000个?),但不需要将整个文件加载到内存中。就性能而言,我想手动步进可能与这个领域功能的任何当前实现一样有效。

抱歉,这不是一个解决方案。看起来ZipFile初始化读取整个文件,但它非常大,我会遇到内存不足错误。 - lubart
你是在询问如何在不加载归档文件的情况下从大型存档中提取压缩文件吗?该存档文件位于设备上还是互联网上某个地方?我担心这听起来像是一个不可能完成的任务,但请提供更多信息。 - Code Jockey
谢谢你的回答。这个文件位于sdcard上。是的,我想从归档中提取一个文件,而不必读取所有zip文件。我知道在Linux上可以使用unzip命令实现,希望在Android上也能实现... - lubart
根据内存限制的假设,添加了一些信息。我认为Java API无法提供文件的简便查找和低内存使用率,你可能需要在两者之间做出抉择。 - Code Jockey
谢谢您的回复。我会阅读并尝试组织一些东西 :) - lubart

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