Случайный файл из папки внутри JAR - PullRequest
0 голосов
/ 07 февраля 2020

Я хочу получить случайное изображение из указанной папки c в Java. Код уже работает внутри Eclipse IDE, но не в моем работающем JAR. Поскольку изображения внутри файла JAR не являются файлами, приведенный ниже код приводит к исключению NullPointerException, но я не уверен, как «перевести» код, чтобы он работал в работающем JAR.

final File dir = new File("images/");
File[] files = dir.listFiles();
Random rand = new Random();
File file = files[rand.nextInt(files.length)];

Ответы [ 4 ]

0 голосов
/ 07 февраля 2020

Вы можете создать текстовый файл со списком путей к ресурсам изображений. Это позволит вам просто прочитать все строки из этого файла и получить доступ к ресурсу через Class.getResource.

. Вы даже можете создать такой список автоматически. Следующее работает для моего типа проекта в Eclipse; Для вашей IDE могут потребоваться некоторые незначительные корректировки.

private static void writeResourceCatalog(Path resourcePath, Path targetFile) throws IOException {
    URI uri = resourcePath.toUri();
    try (BufferedWriter writer = Files.newBufferedWriter(targetFile, StandardCharsets.UTF_8)) {
        Files.list(resourcePath.resolve("images")).filter(Files::isRegularFile).forEach(p -> {
            try {
                writer.append('/').append(uri.relativize(p.toUri()).toString()).append('\n');
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });
    }
}
writeResourceCatalog(Paths.get("src", "main", "resources"), Paths.get("src", "main", "resources", "catalog.txt"));

После сборки банки с новым файлом вы можете просто перечислить все файлы как

List<URL> urls = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(WriteTest.class.getResourceAsStream("/catalog.txt"), StandardCharsets.UTF_8))) {
    String s;
    while ((s = reader.readLine()) != null) {
        urls.add(SomeType.class.getResource(s));
    }
}
0 голосов
/ 07 февраля 2020

Если указанный путь недопустим, тогда listFiles() метод возвращает значение null. Таким образом, вы должны справиться с этим, если путь неверен. Проверьте ниже код:

    final File dir = new File("images/");
    File[] files = dir.listFiles();
    Random rand = new Random();
    File file = null;
    if (files != null) {
        file = files[rand.nextInt(files.length)];
    }
0 голосов
/ 07 февраля 2020

Если файл jar должен содержать изображения, то (при условии проекта maven или gradle) они должны находиться в каталоге ресурсов (или его подкаталоге). Эти изображения тогда действительно не «Файлы», а «Ресурсы» и должны быть загружены с использованием getClass().getResource(String name) или getClass.getResourceAsStream(String name).

0 голосов
/ 07 февраля 2020

Кажется, что путь Проблема, возможно, будет работать, если попытаться использовать абсолютный путь для каталога изображений или установить каталог maon для java конфигурации

...