Я хотел бы прочитать ресурс из моей банки, например, так:
File file;
file = new File(getClass().getResource("/file.txt").toURI());
BufferredReader reader = new BufferedReader(new FileReader(file));
//Read the file
и он отлично работает при запуске его в Eclipse, но если я экспортирую его в банку, то при запуске возникает исключение IllegalArgumentException:
Exception in thread "Thread-2"
java.lang.IllegalArgumentException: URI is not hierarchical
и я действительно не знаю почему, но с некоторым тестированием я обнаружил, если я изменюсь
file = new File(getClass().getResource("/file.txt").toURI());
в
file = new File(getClass().getResource("/folder/file.txt").toURI());
тогда это работает наоборот (это работает в банке, но не затмение).
Я использую Eclipse, и папка с моим файлом находится в папке класса.
getResourceAsStream
это все еще более простое и более портативное решение проблемы.Ответы:
Вместо того, чтобы пытаться обратиться к ресурсу как к файлу, просто попросите ClassLoader вернуть InputStream для ресурса вместо этого через getResourceAsStream :
Пока
file.txt
ресурс доступен в пути к классам, этот подход будет работать одинаково независимо от того, находитсяfile.txt
ресурс вclasses/
каталоге или внутриjar
.URI is not hierarchical
Происходит потому , что URI для ресурса внутри файла банки будет выглядеть примерно так:file:/example.jar!/file.txt
. Вы не можете прочитать записи вjar
(zip
файле), как если бы это был простой старый файл .Это хорошо объясняется ответами на:
источник
InputStream
существует ли (напримерFile.exists()
), чтобы моя игра могла определить, использовать ли файл по умолчанию или нет. Спасибо.getClass().getResource("**/folder**/file.txt")
заставила его работать, потому что у меня была эта папка в той же директории, что и мой jar :).getResourceAsStream
возвращает ноль, если ресурс не существует, так что это может быть вашим тестом «существует».Для доступа к файлу в банке у вас есть два варианта:
Поместите файл в структуру каталогов, соответствующую имени вашего пакета (после извлечения файла .jar он должен находиться в том же каталоге, что и файл .class), а затем получите к нему доступ, используя
getClass().getResourceAsStream("file.txt")
Поместите файл в корень (после извлечения файла .jar он должен быть в корне), а затем получите к нему доступ, используя
Thread.currentThread().getContextClassLoader().getResourceAsStream("file.txt")
Первый вариант может не работать, когда jar используется как плагин.
источник
У меня была эта проблема раньше, и я сделал запасной способ загрузки. Первый способ работает в файле .jar, а второй - в Eclipse или другой IDE.
источник
До сих пор (декабрь 2017 года) это единственное найденное мной решение, которое работает как внутри, так и за пределами IDE.
Используйте PathMatchingResourcePatternResolver
Примечание: это работает также в весенней загрузке
В этом примере я читаю некоторые файлы, расположенные в src / main / resources / my_folder :
источник
Проблема заключается в том, что некоторым сторонним библиотекам требуются имена файлов, а не входные потоки. Большинство ответов не решают эту проблему.
В этом случае одним из обходных путей является копирование содержимого ресурса во временный файл. В следующем примере используется jUnit
TemporaryFolder
.источник
Если вы хотите прочитать как файл, я думаю, что есть еще похожее решение:
источник
file:
URL.Убедитесь, что вы работаете с правильным разделителем. Я заменил все
/
в относительном пути сFile.separator
. Это отлично работало в IDE, однако не работало в JAR сборки.источник
Я думаю, что это должно работать и в Java. Следующий код, который я использую, использует kotlin.
источник
Я нашел исправление
Замените «Main» на класс java, в котором вы его закодировали. Замените «path» на путь в файле jar.
например, если вы поместите State1.txt в пакет com.issac.state, введите путь как «/ com / issac / state / State1», если вы используете Linux или Mac. Если вы используете Windows, введите путь как «\ com \ issac \ state \ State1». Не добавляйте расширение .txt в файл, если не возникает исключение «Файл не найден».
источник
Вы можете использовать загрузчик классов, который будет читать из classpath как путь ROOT (без "/" в начале)
источник
Если вы используете Spring, то вы можете использовать следующий метод для чтения файла из src / main / resources:
источник
По какой-то причине
classLoader.getResource()
всегда возвращал null, когда я развертывал веб-приложение в WildFly 14. Получение classLoader изgetClass().getClassLoader()
илиThread.currentThread().getContextClassLoader()
возвращает null.getClass().getClassLoader()
Документ API говорит,«Возвращает загрузчик класса для класса. Некоторые реализации могут использовать null для представления загрузчика класса начальной загрузки. Этот метод будет возвращать null в таких реализациях, если этот класс был загружен загрузчиком класса начальной загрузки».
может быть, если вы используете WildFly и ваше веб-приложение попробуйте это
request.getServletContext().getResource()
вернул URL ресурса. Здесь запрос является объектом ServletRequest.источник
Ниже приведен код, работающий с Spring boot (kotlin):
источник