получение всех имен файлов в пакете ресурсов и работа для не jar и jar работает - PullRequest
0 голосов
/ 05 мая 2018

Я уже прошу прощения за столь неточный титул, но эта проблема имеет быть в особых обстоятельствах. В настоящее время я пишу небольшую Sokoban-игру, и у меня есть несколько предустановленных игр в различные .txt файлы. Эти файлы находятся в / resources / presets / * .txt в папке src. Поэтому, когда я создаю jar-файл, они также будут расположены здесь: ... / GameBox.jar! / Ресурсы / пресеты / *. TXT

Чтение уже известных текстовых файлов из этого пакета не проблема (я так делаю)

BufferedReader rd = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/resources/presets/standard.txt")));

НО я хочу иметь список всех текстовых файлов в этом пакете, чтобы я мог переключаться между ними и добавлять новые, просто помещая их в папку.

Этот список текстовых файлов в пакете должен создаваться, когда программа запускается командой javac или из jar-файла.

Я посмотрел некоторые другие коды переполнения стека, вот такие:

List<String> getResourceFiles(String path) throws IOException{
    List<String> filenames = new ArrayList<>();
    try(InputStream in = getResourceAsStream(path);
        BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
        String resource;
        while((resource=br.readLine())!=null){
            filenames.add(resource);
        }
    }
    return filenames;
}

private  InputStream getResourceAsStream(String resource){
    final InputStream in = getContextClassLoader().getResourceAsStream(resource);
    System.out.println(in);
    return in==null?getClass().getResourceAsStream(resource):in;
}

private  ClassLoader getContextClassLoader() {
    System.out.println(Thread.currentThread().getContextClassLoader());
    return Thread.currentThread().getContextClassLoader();
}

и этот:

public static List<String> getFiles(String paths) {
    List<String> filesList = new ArrayList<>();
    List<File> files = new ArrayList<>();
    for (final String path : paths.split(File.pathSeparator)) {
        final File file = new File(path);
        System.out.println(path);
        if( file.isDirectory()) {
            recurse(files, filesList, file);
        }
        else {
            filesList.add(file.getName());
        }
    }
    return filesList;
}
private static void recurse(List<File> filesList, List<String> files, File f) {
    File list[] = f.listFiles();
    for (File file : list) {
        if (file.isDirectory()) {
            recurse(filesList, files, file);
        }
        else {
            filesList.add(file);
            files.add(file.getName());

        }
    }
}

Оба эти двух разных подхода работают на выполнение программы с помощью команды javac, но ни один из них не работает, когда я создаю jar-файл и пытаюсь его запустить.

Я использую Intellij для кодирования и сборки файла JAR, если кто-то обеспокоен этим

PS: я не хочу использовать новые пакеты, такие как spring (например, PathMatchingResourcePatternResolver)

1 Ответ

0 голосов
/ 05 мая 2018

Jar не действует как файловая система (например, может использоваться как File).

Подход, который здесь следует использовать, заключается в том, чтобы включить текст на основе file.list, который готовится (и включается) при сборке Jar. Приложение. можно получить список, используя что-то вроде:

URL fileListURL = getClass().getResource("/resource/file.list");

Затем продолжайте читать список построчно перед загрузкой (или перечислением) каждого.

...