Можно прописать абсолютный путь к файлу, скажем вот так:
Image img = new ImageIcon("G:\\img.png").getImage();
Насколько я понимаю, так делать совсем плохо, ибо мы не знаем, куда пользователь сохранит нашу программу.
Можно прописать относительный путь к файлу, скажем вот так:
Image img = new ImageIcon("img.png").getImage();
Но тогда (если только я правильно понял из проделанных экспериментов) чтобы получить полный путь к файлу JVM делает "конкатенацию" текущей директории с прописанным относительным путём. Т.е. если я запускаю программу такой командой:
G:\program\bin>java -jar Program.jar
То JVM будет искать файл по такому расположению:
G:\program\bin\img.png
Насколько я понимаю, так делать совсем плохо, ибо мы не знаем, с какой директории будет запускать пользователь нашу программу.
Можно делать что-то вообще интересное и непростое, типа такого:
Image img = new ImageIcon( this.getClass().getResource("img.png") ).getImage();
Здесь поиск файла будет происходить из пакета, где находится класс this.getClass(). (т.е. та самая "конкатенация" происходит с путём к пакету класса)
Но ведь наверное плохо мешать файлы классов с файлами ресурсов?
Или даже так:
Image img = new ImageIcon( this.getClass().getResource("/img.png") ).getImage();
Здесь поиск файла происходит в директориях classpath. Но по идее, тогда может оказаться несколько подходящих файлов? И что же это будет?!
В общем вопросы:
Правильно ли то, что я написал?
Какие ещё способы существуют?
Когда какой способ использовать?
Какой способ наилучший (если он существует)?
Ответ
Общим ответом на это будет просто слово "зависит" - главный вопрос в том, с чем вы работаете. Как правило, java-приложения распространяются в виде jar-архивов, и если у вас есть распространяемые с приложением ресурсы (например, иконки), то они должны либо оказаться именно там, среди классов, либо, если вы распространяете приложение в виде архива и отдельных ресурсов снаружи архива, то вам нужно самому находить расположение jar-файла и вручную восстанавливать путь к ресурсом по аналогии с working directory. В случае, если вы пишете некоторую утилиту, которая обрабатывает аргументы, то вам, скорее всего, придется иметь дело из абсолютными, и с относительными путями - если вы пишете, скажем, ресайзер изображений, то вызов java -jar path/resizer.jar image.png 300x400 потребует простого проброса аргумента внутрь ImageIcon напрямую, без вообще какого-либо анализа.
Другими словами, все описанные методы имеют свое применение, и являются более или менее предпочтительными в зависимости от ситуации; каждый из них не чем-то плох, а неприменим в текущей ситуации. Если вопрос заключается в поиске ресурсов приложения, то лучше всего либо закидывать в jar, либо искать место установки приложения и отсчитывать от него (т.к. working dir может оказатсья любым).
Комментариев нет:
Отправить комментарий