我花了数个小时寻找答案,但仍无法弄清楚。我正在尝试将包含我正在开发的游戏的所有图像和数据文件的资源文件夹从运行的jar文件中复制到E:/Program Files/mtd/中。当我在eclipse中运行它时,一切正常,但当我导出jar文件并尝试运行时,会出现NoSuchFileException错误。
`JAR
Installing...
file:///C:/Users/Cam/Desktop/mtd.jar/resources to file:///E:/Program%20Files/mtd
/resources
java.nio.file.NoSuchFileException: C:\Users\Cam\Desktop\mtd.jar\resources
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.WindowsFileAttributeViews$Basic.readAttributes(Unknown Sou
rce)
at sun.nio.fs.WindowsFileAttributeViews$Basic.readAttributes(Unknown Sou
rce)
at sun.nio.fs.WindowsFileSystemProvider.readAttributes(Unknown Source)
at java.nio.file.Files.readAttributes(Unknown Source)
at java.nio.file.FileTreeWalker.walk(Unknown Source)
at java.nio.file.FileTreeWalker.walk(Unknown Source)
at java.nio.file.Files.walkFileTree(Unknown Source)
at java.nio.file.Files.walkFileTree(Unknown Source)
at me.Zacx.mtd.main.Game.<init>(Game.java:94)
at me.Zacx.mtd.main.Game.main(Game.java:301)`
这是我使用的代码:
if (!pfFolder.exists()) {
pfFolder.mkdir();
try {
URL url = getClass().getResource("/resources/");
URI uri = null;
if (url.getProtocol().equals("jar")) {
System.out.println("JAR");
JarURLConnection connect = (JarURLConnection) url.openConnection();
uri = new URI(connect.getJarFileURL().toURI().toString() + "/resources/");
} else if (url.getProtocol().equals("file")) {
System.out.println("FILE");
uri = url.toURI();
}
final Path src = Paths.get(uri);
final Path tar = Paths.get(System.getenv("ProgramFiles") + "/mtd/resources/");
System.out.println("Installing...");
System.out.println(src.toUri() + " to " + tar.toUri());
Files.walkFileTree(src, new SimpleFileVisitor<Path>() {
public FileVisitResult visitFile( Path file, BasicFileAttributes attrs ) throws IOException {
return copy(file);
}
public FileVisitResult preVisitDirectory( Path dir, BasicFileAttributes attrs ) throws IOException {
return copy(dir);
}
private FileVisitResult copy( Path fileOrDir ) throws IOException {
System.out.println("Copying " + fileOrDir.toUri() + " to " + tar.resolve( src.relativize( fileOrDir ) ).toUri());
Files.copy( fileOrDir, tar.resolve( src.relativize( fileOrDir ) ) );
return FileVisitResult.CONTINUE;
}
});
System.out.println("Done!");
} catch (IOException e) {
e.printStackTrace();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
%20
是HTML转义空格,这可能是由于.toUri()
的URL编码引起的问题。第94行具体在哪里?(Game.java:94
)C:\Users\Cam\Desktop\mtd.jar\resources
是一个文件夹还是一个文件? - Maximilian Gerhardtjava.nio.file.NoSuchFileException: C:\Users\Cam\Desktop\mtd.jar\resources
时,它不是正确的吗?因为\resources
确实是一个文件夹,而不是目录?在遍历文件树的方式中一定存在某些错误。也许尝试先创建文件夹?你的copy()
函数似乎没有被调用,否则我们会看到Copying .. to ...
输出行,或者它正在.resolve()
或relativize()
函数中的确切System.out.println()
行崩溃。添加更多的调试输出以确保。 - Maximilian Gerhardtfile
协议路径。当所有内容打包到jar文件中时,您无法简单地进行树形遍历;标准的树形遍历只会将jar文件报告为常规文件并继续处理下一个条目。您必须"打开"jar文件作为其自己的文件系统,以便在其中进行树形遍历。 - AJNeufeld