2016-07-09 17 views
1

Derzeit versuche ich einen Level-Editor für ein Java-Spiel, das ich erstellt habe.
Mein Problem ist, dass mein Programm die bearbeiteten Ebenen nicht speichert. HierFileSystem Fehler beim Versuch, es zu schließen

ist der Code, den ich bisher gemacht:

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 ist die .jar-Datei von meinem Spiel, das die Ebenen und die Ebenen enthält als .png-Dateien gespeichert.
Ich habe versucht, mein Bild außerhalb des Glases zu speichern und es funktionierte, also vermute ich, dass ich einen Fehler mit dem Dateisystem oder dem Pfad gemacht habe.
Der Weg in das Glas ist rpg/levels/Niveau * .png

Edit:
I

geändert
OutputStream os = Files.newOutputStream(p); 

zu

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

aber jetzt bekomme ich einen Fehler, wenn das Schließen filesystem

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) 
+0

Wenn ein Benutzer Ihre Frage beantwortet auch bitte ** ** akzeptieren seine Antwort ([Akzeptieren Antworten: Wie funktioniert das?] (Https: // Meta .stackexchange.com/questions/5234/Wie-akzeptiert-eine-Antwort-Arbeit)). Wenn nicht, geben Sie bitte an, was unbeantwortet bleibt, dies ist ein sehr wichtiger Teil von StackOverflow, vielen Dank. – Zabuza

Antwort

1

Sie kann nichts in einem unterjar-File (bezogenen: updating-a-jar-whilst-running) speichern.

Wenn Sie auch etwas in einem nicht laufendenjar-File speichern möchten, müssen Sie auch die komprimierte Datei speichern. Für diese Aufgabe können Sie einfach einen ZipOutputStream zu Ihrer Stream-Queue hinzufügen (Java-Doc: ZipOutputStream.html). Auch java.util.jar.JarFile und java.util.jar.JarEntry können hilfreich sein. Für Ihre allgemeine Aufgabe sollten Sie die Level-Datei außerhalb der jar speichern. Sie können das Spiel in einem Ordner game mit /game/theGame.jar und /game/firstLevel.lvl verteilen. Dann ist das Level außerhalb des Jars und du kannst es modifizieren.

Sie können auch gemeinsame Verzeichnisse wie andere Spiele, wie Windows Documents oder AppData für spielspezifische Einstellungen und Daten verwenden.

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

+0

Wenn ich meine Ebenen in MyDocuments oder AppData speichern würde, wäre sie an einen bestimmten Computer gebunden, aber ich möchte, dass das Spiel wie "Plug & Play" ist. Ich habe versucht, mit ZipOutputStream, aber es löscht alle meine Dateien, die zuvor in meiner JAR-Datei – Jorolf

+0

waren Sie können das gesamte Archiv über 'ZipInputStream' extrahieren, ändern und dann das Archiv mit' ZipOutputStream' neu erstellen, einfach google um * java, wie ein Jar zu ändern *. Aber ich würde empfehlen, die erste Option zu verwenden. Verwenden Sie einen Ordner ** "MyGame" **, der die Ordner "jar" und Ressourcen enthält. Dann können Sie die Ressourcen vollständig steuern, da sie sich außerhalb des Jars selbst befinden. – Zabuza

+0

Wie bereits erwähnt, kann die Klasse 'JarFile' sehr hilfreich sein, um den Inhalt einer' jar-Datei' zu ändern. Hier ist das Dokument: [JarFile.html] (https://docs.oracle.com/javase/7/docs/api/java/util/jar/JarFile.html) – Zabuza

Verwandte Themen