Относительные пути к файлам Java - PullRequest
6 голосов
/ 26 декабря 2011

У меня вопрос по Java, с которым у меня возникли проблемы: как правильно указать относительные пути к файлам.

Позвольте мне быть более конкретным. Я хочу иметь возможность всегда искать файлы конфигурации в ./configuration/file.txt. У меня проблема в том, что моя программа будет работать правильно только в том случае, если она запускается из каталога, в котором находится файл. Если вместо этого я запускаю его из другого каталога, например ./directory/to/my/program/execute.sh, то он не работает правильно.

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

Ответы [ 4 ]

7 голосов
/ 26 декабря 2011

Предлагаемый (чтобы приложение не зависело от деталей, относящихся к среде) способ чтения информации о конфигурации состоит в том, чтобы читать ее как ресурс classpath , а не как ресурс файловой системы.Прочитайте Осторожно загрузите ваши свойства для получения более подробной информации.

Прочтите Class.getResourceAsStream javadoc для получения синтаксиса о том, как указать путь к ресурсу

Полезное сообщение наSO: Ресурс Classpath внутри jar

3 голосов
/ 26 декабря 2011

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

Например:

String userHomeDir = System.getProperty("user.home", ".");
String systemDir = userHomeDir + "/.collection";

И затем вы можете получить файл позже с чем-то вроде

String fileLocation = systemDir + "/file.txt";
3 голосов
/ 26 декабря 2011

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

2 голосов
/ 26 декабря 2011

Если вы хотите, чтобы /configuration/file.txt обозначал файл относительно чего-либо, вам нужно будет определить, что это такое. Обычно мы допускаем, чтобы что-то было «classpath или текущим каталогом». Вам придется написать некоторый код, чтобы это работало. Что-то вроде следующего (не проверено).

public InputStream getResource( String path ) throws IOException {
  // try relative to current directory
  File file = new File( path );
  if ( file.exists() ) {
    return new FileInputStream( file );
  }
  // try the classpath
  return Thread.currentThread().getContextClassLoader().getResourceAsStream( path );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...