【问题标题】:FileSystem error when trying to close it尝试关闭文件系统时出错
【发布时间】:2016-11-12 02:29:00
【问题描述】:

目前我正在尝试为我创建的 Java 游戏制作关卡编辑器。
我的问题是我的程序没有保存编辑过的关卡。

这是我目前制作的代码:

Path path = Paths.get(gameFile.getAbsolutePath());
FileSystem fs = FileSystems.newFileSystem(path, null);
Path p = fs.getPath("rpg"+fs.getSeparator()+"levels"+fs.getSeparator()+"level"+(short)level+".png");
OutputStream os = Files.newOutputStream(p);
ImageIO.write(img, "png", os);
os.close();
fs.close();

gameFile 是我游戏的 .jar 文件,其中包含关卡和 关卡保存为 .png 文件。
我试图将我的图片保存在 jar 之外并且它有效,所以我想我在文件系统或路径上犯了一个错误。
jar 中的 Path 是 rpg/levels/level*.png

编辑:
我变了

OutputStream os = Files.newOutputStream(p);

OutputStream os = Files.newOutputStream(p,StandardOpenOption.CREATE,StandardOpenOption.TRUNCATE_EXISTING);

但现在关闭文件系统时出现错误

java.nio.file.FileSystemException: G:\RPG.jar: The process cannot access the file because it is being used by another process.

at sun.nio.fs.WindowsException.translateToIOException(Unknown Source)
at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
at sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
at sun.nio.fs.WindowsFileSystemProvider.implDelete(Unknown Source)
at sun.nio.fs.AbstractFileSystemProvider.delete(Unknown Source)
at java.nio.file.Files.delete(Unknown Source)
at com.sun.nio.zipfs.ZipFileSystem.sync(ZipFileSystem.java:1294)
at com.sun.nio.zipfs.ZipFileSystem.close(ZipFileSystem.java:277)
at de.jorolf.editor.LevelEditor$5.actionPerformed(LevelEditor.java:213)

【问题讨论】:

  • 如果用户回答了您的问题,请同时接受他的回答 (Accepting Answers: How does it work?)。如果不是,请说明什么仍未得到答复,这是 StackOverflow 的一个非常重要的部分,非常感谢。

标签: java jar nio


【解决方案1】:

您无法在 running jar-File(相关:updating-a-jar-whilst-running)中保存任何内容。

另外,如果你想在 not running jar-File 中保存一些东西,那么你还需要保存压缩文件。对于这个任务,您可以简单地将ZipOutputStream 添加到您的流队列(Java-Doc:ZipOutputStream.html)。 java.util.jar.JarFilejava.util.jar.JarEntry 也可能会有所帮助。

对于您的一般任务,您应该将关卡文件保存在jar 之外。您可以在game/game/theGame.jar/game/firstLevel.lvl 的文件夹中分发游戏。那么关卡就在jar之外,你可以修改它。

您也可以像其他游戏一样使用通用目录,例如 Windows DocumentsAppData 用于游戏特定设置和数据。

MyDocuments 在 Java 中:FileSystemView.getFileSystemView().getDefaultDirectory().getPath() AppData 在 Java 中:System.getenv("APPDATA")

【讨论】:

  • 如果我将我的关卡保存在 MyDocuments 或 AppData 中,它将绑定到特定的计算机,但我希望游戏像“即插即用”。我尝试使用 ZipOutputStream 但它删除了我以前在我的 jar 文件中的所有文件
  • 您可以通过ZipInputStream 提取整个存档,使用ZipOutputStream 修改然后重新创建存档,只需在 java 如何修改 jar 周围搜索。但我建议使用第一个选项。使用包含 jar 和资源文件夹的文件夹 "MyGame"。然后您就可以完全控制这些资源,因为它们在 jar 本身之外。
  • 如前所述,JarFile 类可能对更改jar-File 的内容很有帮助。这是文档:JarFile.html
  • 我会使用 JarFile,但我不知道如何向其中添加文件。我可以得到一个条目,但如果它不存在我只是一个错误。
  • 这里是一些将文件添加到 jar 文件的代码:stackoverflow.com/a/1281295/2411243
猜你喜欢
  • 1970-01-01
  • 2018-03-31
  • 2017-11-09
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
  • 2019-07-31
  • 1970-01-01
  • 2021-03-31
相关资源
最近更新 更多