Nano Hash - криптовалюты, майнинг, программирование

Как скопировать папку из ресурсов из jar как во время выполнения, так и в dev-env?

В настоящее время я делаю игру, в которой есть заранее подготовленные уровни, и в настоящее время я храню их в ресурсах. Мне нужно решение, как извлечь папку из банки в среде производства и разработки.

Я попытался скопировать папку, используя указанный ниже метод, и передать src как File defaultWorld = new File(GameData.class.getClassLoader().getResource("worlds/").getFile()); и пункт назначения как private static File worldsDir = new File("run/worlds");.

public static void copyFolder(File src, File dest) {
    try {
        if (src.isDirectory()) {
            if (!dest.exists()) {
                dest.mkdir();
            }
            String[] files = src.list();

            for (String file : files) {
                copyFolder(new File(src, file), new File(dest, file));
            }
        } else {
            try (InputStream in = new FileInputStream(src)) {
                try (OutputStream out = new FileOutputStream(dest)) {
                    byte[] buffer = new byte[1024];
                    int length;
                    //copy the file content in bytes
                    while ((length = in.read(buffer)) > 0) {
                        out.write(buffer, 0, length);
                    }
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Я ожидал, что описанный выше метод будет работать как в dev, так и в рабочей среде, но он выдает FileNotFoundException при открытии потока вывода файла.


Ответы:


1

Вы не можете перечислять ресурсы в банке.

Любые обходные пути, о которых вы думаете, ненадежны.

  • Никогда не вызывать метод getFile() URL. Он не возвращает допустимое имя файла; он просто возвращает часть пути и запроса URL-адреса с любыми процентными экранами. Кроме того, записи jar не являются file: URL-адресами, поэтому путь к ресурсу никогда не может быть допустимым именем файла, когда он ссылается на запись jar.
  • Единственный способ перечислить вещи в файле jar — это перебрать все записи jar, но вам даже не гарантируется доступ к вашему jar, потому что ClassLoaders не гарантируется как URLClassLoaders и, как правило, не гарантируется использование jar: URL-адреса.
  • Вы даже не можете полагаться на MyApplication.class.getProtectionDomain().getCodeSource(), потому что getCodeSource() может возвращать значение null.

Если вы хотите скопировать несколько файлов из jar-файла, вот несколько надежных способов сделать это:

  • Жестко закодируйте список ресурсов, которые вы планируете копировать. Это ваше приложение, поэтому вы знаете, какие файлы вы кладете в банку.
  • Сохраните в банке один текстовый файл, содержащий список путей к ресурсам для копирования.
  • Храните свои ресурсы в одном zip-архиве, встроенном в банку, и извлекайте его самостоятельно с помощью файла ZipInputStream, который обертывает MyApplication.class.getResourceAsStream.
17.05.2019
  • Спасибо, я думаю, что второй метод / ответ будет тем, что я собираюсь сделать. Спасибо за подробное объяснение. 17.05.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..