Чтение файла в JAR с использованием относительного пути - PullRequest
6 голосов
/ 20 февраля 2011

У меня есть текстовый файл конфигурации, который должен быть прочитан моей программой. Мой текущий код:

protected File getConfigFile() {
    URL url = getClass().getResource("wof.txt");
    return new File(url.getFile().replaceAll("%20", " "));
}

Это работает, когда я запускаю его локально в Eclipse, хотя мне пришлось сделать этот хак, чтобы разобраться с пробелом в имени пути. Файл конфигурации находится в том же пакете, что и описанный выше метод. Однако, когда я экспортирую приложение как банку, у меня возникают проблемы с ним. JAR существует на общем подключенном сетевом диске Z :. Когда я запускаю приложение из командной строки, я получаю эту ошибку:

java.io.FileNotFoundException: файл: \ Z: \ apps \ jar \ apps.jar! \ Vp \ fsm \ configs \ wof.txt

Как я могу заставить это работать? Я просто хочу сказать java читать файл в той же директории, что и текущий класс.

Спасибо, Ионы

1 Ответ

14 голосов
/ 20 февраля 2011

Когда файл находится внутри jar, вы не можете использовать класс File для его представления, так как это jar: URI. Вместо этого сам класс URL уже дает вам openStream() возможность читать содержимое.

Или вы можете сократить это, используя getResourceAsStream() вместо getResource().

Чтобы получить BufferedReader (который проще в использовании, так как он имеет метод readLine()), используйте обычную потоковую упаковку:

InputStream configStream = getClass().getResourceAsStream("wof.txt");
BufferedReader configReader = new BufferedReader(new InputStreamReader(configStream, "UTF-8"));

Вместо "UTF-8" используйте кодировку, фактически используемую файлом (т. Е. Которую вы использовали в редакторе).


Еще один момент: даже если у вас есть только file: URI, вы не должны делать URL для преобразования файлов самостоятельно, вместо этого используйте new File(url.toURI()). Это работает и для других проблемных персонажей.

...