Java как указать путь к файлу из ресурсов

Обновлено: 02.07.2024

Диспетчер файлов ресурсов позволяет добавлять файлы в решение. Затем к этим файлам можно получить программный доступ и использовать ваше решение.

Добавление файлов

Чтобы добавить файлы, нажмите на синюю вкладку РЕШЕНИЕ, а затем на Ресурсы. Нажмите на вкладку «Файл». Вы можете либо перетащить файл, либо нажать кнопку «Добавить». Если вы хотите получить программный доступ к файлу в своем решении, убедитесь, что вы изменили путь опубликованного расположения на /script_lib перед его сохранением. После того как вы обновите опубликованное местоположение, нажмите «Сохранить» в правом верхнем углу.

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

Файлы, хранящиеся в корневом каталоге '/', общедоступны для всех, кто знает URL-адрес движка. Будьте осторожны при размещении файлов, особенно если они содержат конфиденциальные данные.

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

Свойства файла

Вы можете просмотреть свойства файла в файловом менеджере ресурсов, выбрав его. Справа вы увидите такие сведения, как размер, имя и имя пользователя, который в последний раз модифицировал его.

Редактирование имени файла или папки

Чтобы изменить имя файла или его папку, выберите файл из списка и нажмите «Изменить» в правом верхнем углу. Теперь поле станет редактируемым. После того, как вы измените его, убедитесь, что вы нажали «Сохранить» в правом верхнем углу.

Открытие и редактирование файлов во внешнем редакторе

Чтобы открыть файл, просто выберите его и нажмите "Открыть". Он откроется в редакторе, связанном с расширением файла. Это позволяет вам изменять файл вне Teneo. Когда вы сохраните файл в редакторе, Teneo спросит вас, хотите ли вы загрузить изменения на сервер:


Удаление файлов

Чтобы удалить один или несколько файлов, выберите их в файловом менеджере ресурсов и нажмите «Удалить». Вы получите приглашение с вопросом, действительно ли вы хотите удалить файл(ы). У вас есть три возможных варианта:

  • Индивидуально. Выберите каждый файл по очереди и выберите один из вариантов: «Применить», чтобы удалить, или «Отмена», чтобы отменить удаление.
  • Все глобальные переменные вместе: выберите «Сохранить» на левой боковой панели. Выбранные файлы будут удалены.
  • Все вместе. Выберите «Сохранить все» на левой боковой панели. Это сохранит все ваши действия, ожидающие подтверждения, включая потоки и глобальные переменные.

Типы файлов, к которым применяется особая обработка

Вы можете добавить любой файл в решение, но некоторые из них обрабатываются особым образом.

Изображения

Изображения .jpg , .jpg и .jpg по умолчанию хранятся в папке /images. После публикации решения изображения можно получить, добавив /images/[imagename].[extension] к URL-адресу движка.

файлы .groovy

Вы можете добавить классы groovy, сохранив класс в виде файла .groovy с именем класса. При добавлении в Teneo путь к файлам должен быть указан как /script_lib. После сохранения вы можете вызвать класс из любого места в решении. (Вам не нужно компилировать класс, он будет скомпилирован при загрузке решения в память).

.jar-файлы

Если скрипты в вашем решении должны использовать классы, доступные в файлах .jar, вы также можете добавить их в файловый менеджер ресурсов. После сохранения их классы можно использовать в любом месте решения. Файлы JAR по умолчанию хранятся в папке /script_lib.

файлы .jsp

Страницы сервера Java по умолчанию хранятся в папке /views. Эти файлы можно использовать для форматирования ответа механизма Teneo. Их можно использовать, указав тип представления параметра url с именем вашего jsp без расширения в запросах к движку, например так:

Была ли эта страница полезной?

Teneo – зарегистрированная торговая марка Artificial Solutions. © 2022 – Все права защищены.

Как мне получить абсолютный путь к файлу в Java?


6 ответов 6

Правильный способ, который действительно работает:

Теперь не имеет значения, где физически находится файл в пути к классам, он будет найден, если ресурс на самом деле является файлом, а не записью JAR.

(Казавшийся бы очевидным новый File(resource.getPath()) не работает для всех путей! Путь по-прежнему закодирован в URL!)

Или, возможно, вы могли бы просто сделать: new File(resource.toURI()).getAbsolutePath(); (т.е. я не думаю, что вам нужен объект Path?)

Спасибо! Это почти сработало для меня. Но мне пришлось внести одно изменение: YourClass.class.getClassLoader().получитьресурс("abc");

Вы также можете сделать new File(YourClass.class.getResource("abc").toURI().getPath()), если хотите.

Я не понимаю, как это сработало для стольких людей без начальной косой черты: .getResource("/abc")

Вы можете использовать метод ClassLoader.getResource, чтобы получить правильный ресурс.

Хотя это может работать не всегда, есть более простое решение -

Вы можете создать объект File и использовать метод getAbsolutePath:


Совет ограниченного использования, так как он основан на том, что рабочий каталог является корневым каталогом maven. И даже в этом случае вам лучше использовать target/classes/abc.txt для ссылки на файл, так как это каноническое место, куда Maven помещает файлы ресурсов после обработки (например, плагин maven-resources мог выполнить подстановку свойств в abc. текст). Гораздо лучше использовать abc.txt через getResource() из пути к классам.

Что делать, если конечный пользователь запускает ваше приложение как исполняемый файл JAR? Тогда физического файла вообще не будет. Это еще одна причина, по которой вы должны использовать getResource() и, например, открыть входной поток для него в зависимости от того, что вы хотите с ним делать.

Можно ли убрать это как правильный ответ? @Karol S ответила ниже - это должен быть правильный ответ (отсюда и несоответствие голосов)

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

Необходимо указать путь, начинающийся с /

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

Создайте экземпляр classLoader нужного вам класса, после чего вы сможете легко получить доступ к файлам или ресурсам. теперь вы получаете доступ к пути, используя метод getPath() этого класса.


На пути к абсолютному пути есть две проблемы:

  1. Найденное размещение будет не там, где лежат исходные файлы, а там, где сохранен класс. А папка ресурсов почти наверняка будет лежать где-то в исходной папке проекта.
  2. Одни и те же функции для получения ресурса работают по-разному, если класс выполняется в подключаемом модуле или в пакете непосредственно в рабочей области.

Следующий код даст нам все полезные пути:

Здесь исследуются обе функции, которые можно использовать для локализации папки ресурсов. Что касается class , его можно получить любым способом, статически или динамически.

Если проекта нет в подключаемом модуле, код, запущенный в JUnit, напечатает:

Итак, чтобы добраться до src/rest/resources, мы должны пройти вверх и вниз по дереву файлов. Можно использовать оба метода. Обратите внимание, мы не можем использовать getResource(resourceFolderName) , поскольку эта папка не находится в целевой папке. В созданные папки ресурсы никто не кладет, надеюсь.

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

Итак, мы снова должны пройти вверх и вниз по дереву папок.

Самый интересный случай, когда пакет запускается в плагине. Как тест плагина JUnit, для нашего примера. Результат:

Здесь мы можем получить абсолютный путь, только объединяя результаты обеих функций. И этого недостаточно. Между ними мы должны указать локальный путь места, где находятся пакеты классов, относительно папки плагина. Вероятно, вам придется вставить сюда что-то вроде src или src/test/resource.

Ресурс — это данные (изображения, звук, текст и т. д.), к которым программе необходимо получить доступ таким образом, который не зависит от расположения программного кода. Программы Java могут использовать два механизма для доступа к ресурсам: апплеты используют Applet.getCodeBase() для получения базового URL-адреса кода апплета, а затем расширяют базовый URL-адрес с помощью относительного пути для загрузки желаемого ресурса, например, с помощью Applet.getAudioClip(url ). Приложения используют «хорошо известные местоположения», такие как System.getProperty("user.home") или System.getProperty("java.home") , затем добавляют "/lib/resource" и открывают этот файл.

Методы классов Class и ClassLoader обеспечивают независимый от местоположения способ поиска ресурсов. Например, они позволяют находить ресурсы для:

  • Апплет, загружаемый из Интернета с использованием нескольких HTTP-соединений.
  • Апплет, загруженный с использованием файлов JAR.
  • Java Bean, загруженный или установленный в CLASSPATH.
  • Библиотека, установленная в CLASSPATH.

Эти методы не предоставляют специальной поддержки для поиска локализованных ресурсов. Локализованные ресурсы поддерживаются средствами интернационализации.

Ресурсы, имена и контексты

Ресурс идентифицируется строкой, состоящей из последовательности подстрок, разделенных косой чертой (/), за которыми следует имя ресурса. Каждая подстрока должна быть действительным идентификатором Java. Имя ресурса имеет вид shortName или shortName.extension . И shortName, и extension должны быть идентификаторами Java.

Имя ресурса не зависит от реализации Java; в частности, разделителем путей всегда является косая черта (/). Однако реализация Java контролирует детали того, как содержимое ресурса отображается в файл, базу данных или другой объект, содержащий фактический ресурс.

Имя ресурса интерпретируется относительно экземпляра загрузчика классов. Такую интерпретацию выполняют методы, реализованные классом ClassLoader.

Системные ресурсы

Системный ресурс — это ресурс, который либо встроен в систему, либо хранится реализацией хоста, например, в локальной файловой системе. Программы получают доступ к системным ресурсам через методы ClassLoader getSystemResource и getSystemResourceAsStream .

Например, в конкретной реализации поиск системного ресурса может включать поиск записей в CLASSPATH. Методы ClassLoader ищут в каждом каталоге, файле ZIP или файле JAR в CLASSPATH файл ресурсов и, если они найдены, возвращают либо InputStream, либо имя ресурса. Если не найден, методы возвращают null. Ресурс может быть найден в записи CLASSPATH, отличной от места, где был загружен файл класса.

Несистемные ресурсы

Реализация getResource в загрузчике классов зависит от деталей класса ClassLoader. Например, AppletClassLoader:

  • Сначала пытается найти ресурс как системный; то, если не найдено,
  • Выполняет поиск ресурсов в архивах (файлах JAR), уже загруженных в эту БАЗУ КОДА; то, если не найдено,
  • Использует CODEBASE и пытается найти ресурс (что может потребовать обращения к удаленному сайту).

Все загрузчики классов сначала будут искать ресурс как системный ресурс, аналогично поиску файлов классов. Это правило поиска разрешает локальную перезапись любого ресурса. Клиенты должны выбрать имя ресурса, которое будет уникальным (например, с использованием названия компании или пакета в качестве префикса).

Имена ресурсов

Общим соглашением для имени ресурса, используемого классом, является использование полного имени пакета класса, но преобразование всех точек (.) в косую черту (/) и добавление имени ресурса форма имя.расширение . Для поддержки этого и упрощения обработки сведений о системных классах (для которых getClassLoader возвращает null) класс Class предоставляет два удобных метода, которые вызывают соответствующие методы в ClassLoader .

Имя ресурса, присвоенное методу класса, может начинаться с "/", что идентифицирует его как "абсолютное" имя. Имена ресурсов, которые не начинаются с "/", являются "относительными".

Абсолютные имена лишены начального символа "/" и без каких-либо дополнительных изменений передаются соответствующему методу ClassLoader для поиска ресурса. Относительные имена изменяются в соответствии с соглашением, описанным ранее, а затем передаются методу ClassLoader.

Использование методов java.lang.Class

Класс Class реализует несколько методов загрузки ресурсов.

Метод getResource() возвращает URL-адрес ресурса. URL-адрес (и его представление) зависит от реализации и JVM (то есть URL-адрес, полученный в одном экземпляре среды выполнения, может не работать в другом). Его протокол обычно специфичен для ClassLoader, загружающего ресурс. Если ресурс не существует или не отображается из соображений безопасности, методы возвращают значение null.

Если код клиента хочет прочитать содержимое ресурса как InputStream , он может применить метод openStream() к URL-адресу. Это достаточно распространено, чтобы оправдать добавление getResourceAsStream() в Class и ClassLoader. getResourceAsStream() аналогичен вызову getResource().openStream() , за исключением того, что getResourceAsStream() перехватывает исключения ввода-вывода и возвращает null InputStream .

Методы getResource и getResourceAsStream находят ресурс с заданным именем. Они возвращают null, если не находят ресурс с указанным именем. Правила поиска ресурсов, связанных с данным классом, реализуются классовым загрузчиком классов. Методы класса делегируют методы ClassLoader после применения соглашения об именах: если имя ресурса начинается с «/», оно используется как есть. В противном случае имя пакета добавляется после преобразования всех точек (.) в косую черту (/).

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

Использование методов java.lang.ClassLoader

Класс ClassLoader имеет два набора методов для доступа к ресурсам. Один набор возвращает InputStream для ресурса. Другой набор возвращает URL-адрес. Методы, возвращающие InputStream, проще в использовании и удовлетворят многие потребности, а методы, возвращающие URL-адреса, обеспечивают доступ к более сложной информации, например к изображению и аудиоклипу.

Загрузчик классов управляет ресурсами так же, как он управляет классами. ClassLoader управляет тем, как сопоставить имя ресурса с его содержимым. ClassLoader также предоставляет методы доступа к системным ресурсам, аналогичные системным классам. Класс Class предоставляет несколько удобных методов, которые делегируют функциональность методам ClassLoader.

Многие Java-программы получают доступ к этим методам косвенно через I18N (локализация) API. Другие будут получать к нему доступ через методы класса. Некоторые будут напрямую вызывать методы ClassLoader.

Методы в ClassLoader используют заданную строку в качестве имени ресурса без применения каких-либо абсолютных/относительных преобразований (см. методы в классе). В имени не должно быть ведущего «/».

Системные ресурсы — это те, которые обрабатываются реализацией хоста напрямую. Например, они могут быть расположены в CLASSPATH.

Имя ресурса представляет собой последовательность идентификаторов, разделенных знаком "/". Класс Class предоставляет удобные методы для доступа к ресурсам; методы реализуют соглашение, согласно которому имя пакета предшествует короткому имени ресурса.

Доступ к ресурсам можно получить через InputStream или URL-адрес.

Метод getSystemResourceAsStream возвращает InputStream для указанного системного ресурса или null, если ресурс не найден. Имя ресурса может быть любым системным ресурсом.

Метод getResourceAsStream возвращает InputStream для указанного ресурса или null, если ресурс не найден.

Безопасность

Поскольку функция getResource() обеспечивает доступ к информации, она должна иметь четко определенные и обоснованные правила безопасности. Если соображения безопасности не позволяют ресурсу быть видимым в каком-либо контексте безопасности, метод getResource() завершится ошибкой (возвратит null), как если бы ресурс вообще не присутствовал, это устраняет атаки существования.

ClassLoader.getResource и ClassLoader.getSystemResource() и расширяются до методов AsStream, как определено в предыдущем разделе. -->

Загрузчики классов могут не предоставлять доступ к содержимому файла .class как из соображений безопасности, так и из соображений производительности. Возможность получения URL-адреса файла .class зависит от конкретных особенностей, как показано ниже.

Нет определенных проблем с безопасностью или ограничений в отношении ресурсов, обнаруженных несистемным загрузчиком классов. AppletClassLoader обеспечивает доступ к информации, которая загружается из исходного местоположения индивидуально или в группе через файл JAR; таким образом, AppletClassLoader должен применять те же правила checkConnect() при работе с URL-адресами через getResource() .

Система ClassLoader обеспечивает доступ к информации в CLASSPATH. CLASSPATH может содержать каталоги и файлы JAR. Поскольку файл JAR создается преднамеренно, он имеет другое значение, чем каталог, в котором все может оказаться более случайным образом. В частности, мы более строго относимся к получению информации из каталога, чем из файла JAR.

Если ресурс находится в каталоге:

  • Вызовы getResource() будут использовать File.exists(), чтобы определить, сделать ли соответствующий файл видимым для пользователя. Напомним, что File.exists() использует метод checkRead() в диспетчере безопасности.
  • то же самое относится к getResourceAsStream() .

Если ресурс находится в файле JAR:

Примеры

В этом разделе представлены два примера клиентского кода. В первом примере используются имена «абсолютных ресурсов» и традиционные механизмы для получения объекта Class.

В этом примере для получения объекта класса используются имена "относительных ресурсов" и механизм, доступный компилятору с помощью флага -experimental.

В этом руководстве показано, как читать файл из пути к классам или папки ресурсов в Java, с практическими примерами использования File IO, NIO и FileChannel.

Обзор

В следующих разделах мы объясним, как читать файл, который находится в каталоге src/main/resources (Ресурсы). Есть много способов прочитать файл из пути к классам в Java. Они основаны на Java File IO, Java NIO и Java File Channels. В этом уроке мы рассмотрим их все.

Использование Java getResourceAsStream()

Это пример использования метода getResourceAsStream для чтения файла из каталога src/main/resources.

Во-первых, мы используем метод getResourceAsStream для создания экземпляра InputStream. Затем мы создаем экземпляр InputStreamReader для входного потока.Затем мы заключаем средство чтения входного потока в экземпляр BufferedReader.

Метод lines в классе BufferedReader возвращает поток строк, которые лениво считываются из файла. Затем мы печатаем каждую строку из файла на консоли.

Обратите внимание, что в Java File IO нам нужно явно закрыть все потоки и считыватели, которые мы создаем. Кроме того, необходимо закрыть потоки Java 8, созданные из файловых ресурсов ввода-вывода. Для этого мы используем блок try-with-resources для их создания.

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

Разница между ними заключается в том, что когда мы используем getResourceAsStream для класса, путь указывается относительно текущего каталога. Таким образом, мы добавили косую черту (/) к пути. С другой стороны, getResourceAsStream в экземпляре загрузчика класса принимает абсолютный путь. Вот почему мы не добавили косую черту (/).

Использование FileReader

Мы можем использовать BufferedReader, обернув FileReader для чтения содержимого файла. Далее приведен пример использования BufferedReader для чтения файла из пути к классам.

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

Использование Files.newBufferedReader()

Далее показано, как использовать Files.newBufferedReader для чтения файла из каталога ресурсов. Это полезно, когда мы хотим читать файлы большого размера.

Использование Files.lines()

Класс Java Files предоставляет метод lines(), который является еще одной удобной абстракцией, позволяющей избежать шаблонного кода. Далее приведен пример того, как читать ресурс Classpath построчно. Обратите внимание, что мы также предоставляем кодировку UTF-8.

Блок ресурсов try-with-catch гарантирует, что соответствующие потоки будут закрыты, когда блок закончится.

Использование DataInputStream

Далее мы рассмотрим пример использования DataInputStream для чтения данных из файла в каталоге src/main/resources. DataInputStream полезен для чтения примитивных типов данных Java из файла.

Использование FileChannel

Наконец, мы увидим пример использования FileChannel для чтения файла в каталоге ресурсов. Это быстрый способ чтения данных из файла, особенно когда мы имеем дело с большими файлами.

Сначала мы создаем путь из файла ресурсов и используем его для создания экземпляра RandomAccessFile. Затем RandomAccessFile предоставляет FileChannel.

Обзор

В этом подробном руководстве мы рассмотрели различные способы чтения файла из папки src/main/resources в простой Java. Мы предположили, что можем использовать текущий класс или ClassLoader для чтения файла из папки ресурсов в качестве потока.

Кроме того, мы изучили различные способы чтения данных из файла, а также примеры абстракций Java NIO и FileChannel. Мы также узнали, что важно закрыть все потоки файлового ввода-вывода и программы чтения, и мы можем использовать блок try-with-resources, чтобы сделать это автоматически. Чтобы узнать больше о Java, посетите: Учебники по Java.

Читайте также: