Результатом является: java.io.FileNotFoundException: file:/path/to/jarfile/bot.jar!/config/netclient.p (No such file or directory)
Есть ли способ получить путь к файлу ресурсов?
Переведено автоматически
Ответ 1
Это сделано намеренно. Содержимое "файла" может быть недоступно в виде файла. Помните, что вы имеете дело с классами и ресурсами, которые могут быть частью файла JAR или другого вида ресурсов. Загрузчику классов не обязательно предоставлять дескриптор файла для ресурса, например, файл jar, возможно, не был расширен на отдельные файлы в файловой системе.
Все, что вы можете сделать, получив файл a java.io.Это можно сделать, скопировав поток во временный файл и проделав то же самое, если файл a java.io.абсолютно необходим.
Ответ 2
При загрузке ресурса убедитесь, что вы заметили разницу между:
while ((read = input.read(bytes)) != -1) { out.write(bytes, 0, read); } out.close(); file.deleteOnExit(); } catch (IOException ex) { Exceptions.printStackTrace(ex); } } else { //this will probably work in your IDE, but not from a JAR file = newFile(res.getFile()); }
if (file != null && !file.exists()) { thrownewRuntimeException("Error: File " + file + " not found!"); }
В основном getResource метод выдает URL-адрес. Из этого URL-адреса вы можете извлечь путь, вызвав toExternalForm().
Ответ 4
Я некоторое время возился с этой проблемой, потому что, как ни странно, ни одно решение, которое я нашел, на самом деле не сработало! Рабочий каталог часто не является каталогом JAR, особенно если JAR (или любая программа, если на то пошло) запускается из меню "Пуск" в Windows. Итак, вот что я сделал, и это работает для файлов .class, запускаемых извне JAR так же хорошо, как и для JAR. (Я тестировал это только под Windows 7.)
try { //Attempt to get the path of the actual JAR file, because the working directory is frequently not where the file is. //Example: file:/D:/all/Java/TitanWaterworks/TitanWaterworks-en.jar!/TitanWaterworks.class //Another example: /D:/all/Java/TitanWaterworks/TitanWaterworks.class PROGRAM_DIRECTORY = getClass().getClassLoader().getResource("TitanWaterworks.class").getPath(); // Gets the path of the class or jar.
//Find the last ! and cut it off at that location. If this isn't being run from a jar, there is no !, so it'll cause an exception, which is fine. try { PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(0, PROGRAM_DIRECTORY.lastIndexOf('!')); } catch (Exception e) { }
//Find the last / and cut it off at that location. PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(0, PROGRAM_DIRECTORY.lastIndexOf('/') + 1); //If it starts with /, cut it off. if (PROGRAM_DIRECTORY.startsWith("/")) PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(1, PROGRAM_DIRECTORY.length()); //If it starts with file:/, cut that off, too. if (PROGRAM_DIRECTORY.startsWith("file:/")) PROGRAM_DIRECTORY = PROGRAM_DIRECTORY.substring(6, PROGRAM_DIRECTORY.length()); } catch (Exception e) { PROGRAM_DIRECTORY = ""; //Current working directory instead. }