2016-07-09 3 views
1

현재 내가 만든 Java 게임의 레벨 편집기를 만들려고합니다.
내 문제는 내 프로그램이 편집 된 수준을 저장하지 않는다는 것입니다.닫으려고 할 때 FileSystem 오류가 발생했습니다.

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가 .png 파일로 저장하는 수준과 수준을 포함 ​​내 게임의 .jar 파일입니다 : 여기

내가 지금까지 만든 코드입니다.
항아리 밖에서 사진을 저장하려고 시도 했으므로 FileSystem이나 Path를 사용하여 실수를 저지른 것 같습니다.
항아리의 경로

편집 .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) 
+0

또한 ** 동의하시기 바랍니다 ** 그의 대답은 ([답변 수락 : 어떻게 작동합니까?] (https : //로 메타 .stackexchange.com/questions/5234/how-does-accepting-an-answer-work)). 답변을 얻지 못했다면 StackOverflow의 중요한 부분입니다. 정말 고마워요. – Zabuza

답변

1

jar-File (관련 : updating-a-jar-whilst-running)을 실행하는 내부에는 아무 것도 저장할 수 없습니다.

또한jar-File이 실행되지 않는 의 내용을 저장하려면 압축 된 파일을 저장해야합니다. 이 작업을 수행하려면 ZipOutputStream을 스트림 대기열에 추가하면됩니다 (Java-Doc : ZipOutputStream.html). 또한 java.util.jar.JarFilejava.util.jar.JarEntry이 도움이 될 수 있습니다.

일반적인 작업의 경우 레벨 파일을 jar 외부에 저장해야합니다. 게임을 game/game/theGame.jar/game/firstLevel.lvl 폴더로 배포 할 수 있습니다. 그런 다음 레벨이 항아리 바깥에 있고 수정할 수 있습니다.

또한 게임 별 설정 및 데이터에 대해 Documents 또는 AppData과 같은 다른 게임과 마찬가지로 일반적인 디렉토리를 사용할 수 있습니다. 자바

MyDocuments : 자바에서 FileSystemView.getFileSystemView().getDefaultDirectory().getPath() AppData :는 사용자가 질문에 대답하는 경우 System.getenv("APPDATA")

+0

내 레벨을 MyDocuments 또는 AppData에 저장하면 특정 컴퓨터에 바인딩되지만, 게임을 '플러그 앤 플레이'와 같게하려고합니다. 나는 ZipOutputStream을 사용하려했지만 이전에 내 jar 파일에 있던 모든 파일을 삭제했습니다. – Jorolf

+0

'ZipInputStream'을 통해 전체 아카이브를 추출하고 수정 한 다음'ZipOutputStream'을 사용하여 아카이브를 다시 만들 수 있습니다. *. 하지만 첫 번째 옵션을 사용하는 것이 좋습니다. 'jar' 폴더와 리소스 폴더가 들어있는 ** "MyGame"** 폴더를 사용하십시오. 그런 다음 항아리 외부에있는 리소스를 완전히 제어 할 수 있습니다. – Zabuza

+0

이전에 말했듯이,'JarFile' 클래스는'jar-File'의 내용을 변경하는데 매우 도움이됩니다. doc [JarFile.html] (https://docs.oracle.com/javase/7/docs/api/java/util/jar/JarFile)이 있습니다.html) – Zabuza

관련 문제