首页 > 解决方案 > ZipFileSystem 无法用路径中的斜杠打开 OutputStream

问题描述

使用以下代码,我得到一个NoSuchFileException: data/:(顺便说一句:为 java 问题上的 scala 语法道歉,但这只是我工作的环境)

val zipLocation = new File("./test.zip")
val zipUri = URI.create("jar:" + zipLocation.toPath.toUri.normalize)
val env = Map("create" -> "true").asJava
val zipFS = FileSystems.newFileSystem(zipUri, env)
// so far so good
val fooInFolder = zipFS.getPath("/data/foo.txt")
val plainOldFoo = zipFS.getPath("foo.txt")

// this doesn't work
Files.newOutputStream(fooInFolder) // NoSuchFileException: data/
// this works fine
Files.newOutputStream(plainOldFoo)

如果有什么不同,我在 Windows 上。我尝试在路径中使用反斜杠,但没有任何区别。

为什么这会失败,当我的 zip 条目路径中有斜杠时,如何让 ZipFileSystem 正常运行?

标签: javascalazipfile

解决方案


感谢评论中的提示,我找到了答案。

ZipOutputStream我以前使用的类不同,它ZipFileSystem要求您先创建一个目录,然后才能在其中写入文件。

在尝试写入之前添加以下内容以fooInFolder修复错误。

val folder = zipFS.getPath("data") // or fooInFolder.getParent and a null check
Files.createDirectory(folder) // or Files.createDirectories

推荐阅读