Java找不到非java文件

标签 java gradle intellij-idea

我正在使用 gradle 构建 2D 游戏项目。我已经设置了 gradle,但是当我将图像和 txt 文件添加到资源文件夹时,我得到 FileNotFoundException:levels/level1_path.txt(没有这样的文件或目录)。

我不能使用 GameEngine.class.getResource("levels/level1_path.txt").getFile() ,因为游戏中有超过 100 个图片和图标,这是错误的。 我需要找到一种方法,使 new File("levels/level1_path.txt") 有效。

我的等级:

plugins {
    id 'java'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

sourceSets {
    main {
        resources {
            srcDirs = ['src/main/resources']
        }
    }
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'

    // slick 2d
    compile files('/Users/faridganbarli/Downloads/slickLIB/lib/jinput.jar')
    compile files('/Users/faridganbarli/Downloads/slickLIB/lib/lwjgl.jar')
    compile files('/Users/faridganbarli/Downloads/slickLIB/lib/lwjgl_util.jar')
    compile files('/Users/faridganbarli/Downloads/slickLIB/lib/slick.jar')

}

我的功能:

private int[][] initLocations() throws FileNotFoundException{
        File file = new File("levels/level1_path.txt");
        Scanner sc = new Scanner(file);
        int[][] loc=new int[sc.nextInt()][2];
        for(int i=0; i<loc.length; i++){
            loc[i][0]=sc.nextInt();
            loc[i][1]=sc.nextInt();
        }
        return loc;
    }

最佳答案

这是一种方法:

我将为每种类型的资源创建一个Map,这将是以下形式的映射: folder/with/resource.ext -> uri:///actual/path/to/folder/with/resource.ext 其中 folder 是您的resources 中的文件夹。在您的情况下,文件夹可能类似于级别

现在在您的代码中,创建这些结构并将它们放在无法修改的位置

public static final Map<String, URI> IMAGE_RESOURCES = Collections.unmodifiableMap(loadAllResources("images"));
public static final Map<String, URI> PATH_RESOURCES = Collections.unmodifiableMap(loadAllResources("levels"));

现在我们定义一个函数,它将加载给定文件夹中的所有资源,并使它们全部可供轻松访问。

private static Map<String, URI> loadAllResources(String folder) {
    ClassLoader loader = Thread.currentThread().getContextClassLoader();
    URL folderUrl = loader.getResource(folder);

    final Path root = Paths.get(folderUrl.toURI()).getParent();

    return Files.walk(Paths.get(folderUrl.toURI()))
                .filter(Files::isRegularFile)
                .collect(Collectors.toMap((p)-> root.relativize(p).toString(), Path::toUri));
}

现在假设您的 resources 文件夹中具有以下文件夹结构:

.
├── images
│   ├── foo.png
│   └── bear.png
└── levels
    └── level1_path.txt

您可以通过执行以下操作加载文件level1_path.txt:

new File(PATH_RESOURCES.get("levels/level1_path.txt"));

引用文献:

关于Java找不到非java文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61311627/

相关文章:

java - 在两个未排序的数组中查找公共(public)元素

spring - 在Heroku上部署Spring应用程序

java - 当 git push 到远程仓库时出现错误 "File java_pid66619.hprof is 661.61 MB; this exceeds GitHub' s 文件大小限制为 100.00 MB"

java - IntelliJ/Gradle - 复合构建项目 - 如何从不同模块导入?

java - 在方法级别而不是类级别的基本 Jax-RS PATH 配置

java - 为什么 FileOutputStream 在文件开头添加空字符和传输结束字符?

java - 在stream中查找对应于post-map minimum的pre-map元素

gradle - 在 Gradle 中多次调用 Zip 任务

java - 在.aar文件Android中添加gradle依赖项(build.gradle)

intellij-idea - 无法在 Intellij 中为 JavaFX 创建 JAR 文件