Где Java помещает файлы ресурсов, когда я JAR моей программы? - PullRequest
3 голосов
/ 02 сентября 2011

Я искал это последние 2 часа и ничего не смог найти (я нашел решение той же проблемы, но с изображениями, а не с текстовыми файлами).

В значительной степени, я сделал программу, которая читает текстовый файл. Файл представляет собой список имен и идентификаторов. Используя Eclipse, я помещаю файл в свою папку src и в программе помещаю путь к нему. Как это:

in = new BufferedReader(new FileReader(curDir+"\\bin\\items.txt"));

Где curDir - текущий каталог пользователя (находится с помощью System.getProperty ("user.dir")).

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

РЕДАКТИРОВАТЬ: решена проблема? Таким образом, JAR-файл должен быть в папке со всеми исходными файлами? Я так растерялся, тогда что это за файл JAR?

Ответы [ 3 ]

2 голосов
/ 02 сентября 2011

Более надежный способ получить файл независимо от того, работаете ли вы с Eclipse или JAR, - это сделать

MyClass.getResource("items.txt")

где MyClass - это класс в том же пакете (папке), что и нужный вам ресурс.

Если Eclipse не помещает файл в ваш JAR, вы можете перейти к

Выполнить -> Выполнить конфигурации -> -> вкладка "Путь к классам" -> Дополнительно -> Добавить папки

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

1 голос
/ 02 сентября 2011

Кстати, FileReader может только читать ресурсы файловой системы диска. Но JAR содержит только ресурсы classpath. Вы должны прочитать его как ресурс classpath. Для этого вам нужно ClassLoader.

Предполагая, что Foo - это ваш класс в JAR, который должен прочитать ресурс, а items.txt помещается в корень пути к классу JAR, тогда вы должны прочитать его следующим образом (примечание: необходим начальный слеш!):

InputStream input = Foo.class.getResourceAsStream("/items.txt");
reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
// ...

Или, если вы хотите быть независимым от класса или контекста времени выполнения, используйте загрузчик классов контекста, который работает относительно корня пути к классу (примечание: начальная косая черта не требуется!):

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("items.txt");
reader = new BufferedReader(new InputStreamReader(input, "UTF-8"));
// ...

(UTF-8 - это, конечно, кодировка, в которую закодирован файл, иначе вы можете увидеть Моджибаке )

0 голосов
/ 21 августа 2012

Получить местоположение вашего файла фляги

Сначала создайте папку (скажем, myfolder) и поместите в нее свои файлы

Рассмотрим следующую функцию

public String path(String filename)
{
URL url1 = getClass().getResource("");
String ur=url1.toString();
ur=ur.substring(9);
String truepath[]=ur.split("myjar.jar!");
truepath[0]=truepath[0]+"myfolder/";
truepath[0]=truepath[0].replaceAll("%20"," ");
return truepath[0]+filename;
}//This method will work on Windows and Linux as well.
//You can alternatively use the following line to get the path of your jar file
//classname.class.getProtectionDomain().getCodeSource().getLocation().getPath();

Предположим, ваш файл JAR находится в D: \ Test \ dist

Тогда path () вернет / D: / Test / dist / myfolder / filename

Теперь вы можете поместить 'myfolder' в папку, в которой находится ваш jar-файл

OR

Если вы хотите получить доступ к файлу, доступному только для чтения, внутри вашего jar-файла, скопируйте его в один

ваших пакетов и можете получить к нему доступ как

* * YourClassname.getResource тысячи двадцать-одина ( "/ имя_пакет / filename.txt"); * * тысяча двадцать-дв
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...