Java 16 - создать объект File из ресурса в затененной банке

У меня есть файл SVG, расположенный во вложенной папке моего проекта, и я создаю объект File, используя этот код:

      URI tempUrl = getClass().getResource("/Resources/matlab_icon.svg").toURI();
File tempFile = new File(tempUrl);

Все объединяется в затененный jar-файл для запуска.

В Java 13 это работает без проблем . Но я обновился до Java 16 и теперь получаю такую ​​ошибку:

      java.lang.IllegalArgumentException: URI is not hierarchical
        at java.base/java.io.File.<init>(File.java:420)

Это URI, который он пытается использовать

      tempURL = jar:file:/C:/Program%20Files/PamguardJava16/PamguardBeta-2.01.06.jar!/Resources/matlab_icon.svg

Я рассмотрел этот вопрос (почему мой URI не иерархический?) И этот вопрос (файл Java Jar: ошибки использования ресурсов: URI не иерархический ), оба из которых точно описывают мою проблему. Но это старые вопросы, поэтому я не понимаю, почему мой код работал до сих пор. Что еще более важно, я не могу использовать рекомендованное решение, потому что я не могу изменить свой код на getResourceAsStream.

Я пробовал изменить / на \\, опуская начальный / и используя getClass().getClassLoader().getResource("/Resources/matlab_icon.svg").toExternalForm() вместо этого, но тогда Java вообще не может найти файл:

      java.lang.NullPointerException: Cannot invoke "java.net.URL.toURI()" because the return value of "java.lang.Class.getResource(String)" is null

У меня была такая же проблема в нескольких других местах при загрузке файла wav. Но те, которые я смог изменить на AudioInputStream, чтобы исправить это (который также сказал мне, что URI правильно указывает на файлы, это, в частности, проблема с созданием объекта File). Любая помощь будет принята с благодарностью. Спасибо.

0 ответов

Другие вопросы по тегам