【发布时间】:2016-07-14 07:15:08
【问题描述】:
我花了好几个小时寻找答案,但我无法弄清楚,我正在尝试复制我的资源文件夹,其中包含我正在运行的游戏的所有图像和数据文件罐子和成 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是文件夹还是文件? -
@MaximilianGerhardt 使用 .replaceAll(...) 删除 %20s 并不能解决问题,Game.java:94 是 Files.walkFileTree(src, new SimpleFileVisitor
() { 和resources 是一个文件夹,其中包含我的游戏的所有图像等。抱歉没有包括这些:/ -
那么,Java 说
java.nio.file.NoSuchFileException: C:\Users\Cam\Desktop\mtd.jar\resources不正确吗,因为\resources确实是一个文件夹,没有目录?您遍历文件树的方式一定有一些错误。也许尝试先创建创建文件夹?您的copy()函数似乎没有被调用,否则我们会看到Copying .. to ...输出行 OR 它在.resolve()或relativize()的确切System.out.println()行中崩溃功能。添加更多调试输出以确保。 -
@MaximilianGerhardt 问题是它没有看到 jar 里面的资源文件夹,文件夹是 100% 在那里,java 似乎看不到它,我不知道为什么因为它是一个文件夹而不是一个文件,所以我必须做一些不同的事情吗?
-
它在 Eclipse 中工作的原因是所有资源都作为单独的文件存在于文件系统中,因此您始终遵循
file协议路径。当所有东西都打包到罐子里时,你不能只是遍历它;标准的树遍历只会将 jar 报告为常规文件并继续进行下一个条目。您必须将 jar 作为自己的文件系统“打开”才能在其中进行树遍历。
标签: java eclipse file program-files