Я сделал небольшую программу на Java для академических целей, ее основное внимание уделяется чтению некоторых файлов .txt и представлению информации пользователю. Эти файлы находятся в папке ресурсов в папке src. Программа работает по назначению при запуске из Eclipse. Используя приложение Launch4j, я смог успешно создать exe, который отлично работает и выполняет то, что задумано, до тех пор, пока я не попытаюсь прочитать файлы .txt, которые у меня есть в папке ресурсов, которые, похоже, не могут быть достигнуты.
Я предполагаю, что когда я запускаю exe, путь времени выполнения изменится на то, где был создан exe, поэтому я создал программу в папке рабочего стола и указал этот путь в программе, но это, похоже, не решает ситуацию .
В качестве альтернативы я переместил файлы .txt из программы и еще раз создал exe в папке на рабочем столе с указанными файлами .txt, связал программу с этим путем, и снова она не сработала.
Для получения файлов .txt используется следующая команда:
Files.readAllLines(Paths.get(doc)).get(line)
А doc - это просто путь к предполагаемому файлу .txt.
Стоит отметить, что у меня нет предыдущего опыта работы с Java, и на протяжении всей разработки программы я изо всех сил старался использовать команды, которые я полностью понимаю, и старался сделать ее как можно более простой. Я надеюсь, что решение может быть таким! Я очень уверен, что это, должно быть, ошибка новичка, но я не могу нигде найти решение этой конкретной проблемы.
Большое спасибо!! Работает как надо !! Если бы я мог проголосовать за вас, я бы сделал это, но, поскольку я новичок, я не могу этого сделать :(
а) Рад, что вы разобрались. б) Голосование за комментарии (в основном) неуместно. Голосование за ответы помогает отсортировать их до самого верха, но Лучший, что вы можете сделать, - это принять ответ, и я отмечаю, что вы уже это сделали, так что все хорошо. :)
Пути к файлам в Eclipse отличаются от путей к файлам в .exe или JAR-файле.
Я позволю этому другому пользователю объяснить это, потому что я ленив: p
Rather than trying to address the resource as a File just ask the ClassLoader to return an InputStream for the resource instead via getResourceAsStream:
InputStream in = getClass().getResourceAsStream("/file.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); As long as the file.txt resource is available on the classpath then this approach will work the same way regardless of whether the file.txt resource is in a classes/ directory or inside a jar.
The URI is not hierarchical occurs because the URI for a resource within a jar file is going to look something like this: file:/example.jar!/file.txt. You cannot read the entries within a jar (a zip file) like it was a plain old File.
This is explained well by the answers to:
Исходное сообщение - здесь, все кредиты его автору.
Исправление URL-адреса должно позволить вам читать из этого файла, когда вы используете .exe.
ИЗМЕНЕНО ДЛЯ ИСПРАВЛЕНИЯ. Спасибо @VGR (см. Комментарии) за исправление моей ошибки.
Вторая часть не имеет особого смысла. Копировать ресурс в отдельный файл необходимо только в том случае, если его нужно изменить во время выполнения. Во время компиляции просто измените файл с помощью IDE или любого инструмента и выполните сборку заново. Если вы только читаете файл (как следует из вопроса), нет никакой причины его копировать.
Спасибо всем за то, что сэкономили мне $ !!! Программа запущена и работает как надо !! [один бокал пива для всех !!!]
Ресурсы приложения станут встроенными ресурсами к моменту развертывания, поэтому разумно начать доступ к ним, как если бы они были, прямо сейчас. Доступ к встроенный ресурс должен осуществляться по URL-адресу, а не по файлу. См. Информация. страница для встроенного ресурса, чтобы узнать, как сформировать URL.