Java не может найти не- java файлы - PullRequest
0 голосов
/ 20 апреля 2020

Я использую Gradle для создания 2D игрового проекта. Я установил gradle, но когда я добавляю изображения и текстовые файлы в папку ресурсов, я получаю FileNotFoundException: level / level1_path.txt (Нет такого файла или каталога).

Я НЕ МОГУ использовать GameEngine.class.getResource ( "levels / level1_path.txt"). getFile (), поскольку в игре более 100 картинок и значков, это будет неправильно. Мне нужно найти способ, чтобы новый файл ("levels / level1_path.txt") работал.

Мой Gradle:

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;
    }

1 Ответ

1 голос
/ 20 апреля 2020

Вот способ сделать это:

Я бы создал Map для каждого типа ресурса, и это будет отображение в форме: folder/with/resource.ext -> uri:///actual/path/to/folder/with/resource.ext, где folder - это папка внутри вашего resources. В вашем случае folder может быть чем-то вроде levels.

Теперь в вашем коде создайте эти структуры и поместите их где-нибудь, чтобы их нельзя было изменить

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"));

Список литературы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...