【问题标题】:Java zip - zip unwanted directoryJava zip - 压缩不需要的目录
【发布时间】:2015-02-14 08:40:44
【问题描述】:

我是 OSX 用户,目前正在使用 Play Framework,当我使用 java.util.zip 将一些文件压缩到文件夹中时,出现了一个奇怪的问题。这些文件将自动生成(完成)到/Users/vorsz/Desktop/MonthlyReport/August。但是当我尝试使用以下代码压缩它们时:

val baseURL: String = "/Users/vorsz/Desktop/MonthlyReport/"
val directoryToZip = new File(baseURL+"August").mkdir()
val writer = new PrintWriter(baseURL+"August/test.html", "UTF-8")
writer.println("<Table><tr><td>45296</td><td>2014-07-23</td><td>2014-08-01</td><td>010194</td><td></td><td>120</td><td>C-00322</td><td>ANK 007</td><td></td><td></td></tr></Table>")
writer.close()
val writer1 = new PrintWriter(baseURL+"August/test2.html", "UTF-8")
writer1.println("<Table><tr><td>45296</td><td>2014-07-23</td><td>2014-08-01</td><td>010194</td><td></td><td>120</td><td>C-00322</td><td>ANK 007</td><td></td><td></td></tr></Table>")
writer1.close()

val f = new FileOutputStream(baseURL+"test.zip")
val zip = new ZipOutputStream(new BufferedOutputStream(f))
zip.putNextEntry(new ZipEntry(baseURL+"August/test.html"))
zip.putNextEntry(new ZipEntry(baseURL+"August/test2.html"))
zip.close()

它会在正确的文件夹中生成一个 zip 文件,但是当我解压它时,它会生成一些不需要的文件夹,例如 UsersvorszDesktopMonthlyReport。所以我需要打开它们,直到我可以访问test.htmltest2.html。当我提取 zip 文件时,我想要的只是一个带有文件或文件本身的 August 文件夹,如果可能的话,两种方式都可以。有人可以帮我吗?

注意:我也尝试过实现ZipUtils class,但仍然得到相同的结果..

【问题讨论】:

  • 你为什么将 baseURL 前缀传递给 ZipEntries?它嵌入到名称中,然后以 zip 名称结尾。
  • 那我怎么把它指向August目录呢?
  • 我看不到将文件内容添加到 zip 流中的代码,但通常您会给出添加数据的位的完整文件路径,以及你记录名字的地方
  • 我只是添加文件生成代码..“位”是什么意思?这是我第一次使用这个库,所以如果你能给出清晰的例子那就太好了..
  • 我没有尝试过你的代码,但我的直觉是你会在你的 zip 中获得 0 字节的文件,因为我看不到任何将文件内容添加到zip,只有文件条目。你确定你在 zip 中得到了他们的内容吗? zip -l 在生成的 zip 中的输出是什么?

标签: java playframework


【解决方案1】:

我认为 Apache Common Compress 库将解决您的问题。
我已经用这个库进行了测试,它工作正常。

您不仅可以参考 zip,还可以参考以下链接中的许多存档类型压缩和解压缩示例。

http://commons.apache.org/proper/commons-compress/examples.html

【讨论】:

  • 只需将这个 apache 库添加到您的 Play Framework 中即可.. 不行吗?
  • 好吧,Play Framework 使用类似 maven 存储库的东西。所以,我需要某种链接来获取库。但是,我的问题不在于存档类型。更多的是关于结构生成的 zip 文件。
  • 哦,我明白了。如果您想使用更强大的 zip lib 来节省时间,我刚刚提到过您。
  • 仅供参考:我仅在 java 项目中测试您的代码。它会正常工作,我从未见过不需要的目录。但我将桌面文件夹路径更改为分区列为 baseURL = "E:/MonthlyReport/";
  • 尝试将文件放入嵌套目录中。如“E:/Users/vorsz/Desktop/MonthlyReport”,看看是否仍然可以删除不需要的目录..
【解决方案2】:

根据您更新的代码,我认为您需要做的不是弄乱文件系统,而是直接将内容生成到 zip 中,并完全控制名称

val baseURL: String = "/Users/vorsz/Desktop/MonthlyReport/"

val f = new FileOutputStream(baseURL+"test.zip")
val zip = new ZipOutputStream(new BufferedOutputStream(f))

zip.putNextEntry(new ZipEntry("/August/test.html"))
val writer = new PrintWriter(new OutputStreamWriter(zip, "UTF-8"))
writer.println("<Table><tr><td>45296</td><td>2014-07-23</td><td>2014-08-01</td><td>010194</td><td></td><td>120</td><td>C-00322</td><td>ANK 007</td><td></td><td></td></tr></Table>")
writer.flush()

zip.putNextEntry(new ZipEntry("/August/test2.html"))
val writer1 = new PrintWriter(new OutputStreamWriter(zip, "UTF-8"))
writer1.println("<Table><tr><td>45296</td><td>2014-07-23</td><td>2014-08-01</td><td>010194</td><td></td><td>120</td><td>C-00322</td><td>ANK 007</td><td></td><td></td></tr></Table>")
writer1.flush()

zip.close()

这将添加一个名称没有基目录的条目,然后将内容写入 zip,然后添加另一个条目,然后写入其他内容。没有文件系统缓冲,不用担心名称,只需生成随手压缩

【讨论】:

  • 你测试了吗?我收到以下错误:overloaded method constructor PrintWriter..
  • 立即尝试 - 转换代码时我会将字符集放在错误的对象上,抱歉
  • 甜,这更好,因为我不需要自己创建文件。谢谢兄弟。我现在会尝试完成这个功能..
猜你喜欢
  • 2012-07-13
  • 2017-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多