Чтение файла свойств из каталога JAR

Строки в Java неизменны. Это означает каждый раз, когда Вы пытаетесь измениться/изменить строку, Вы получаете новый экземпляр. Вы не можете поменять исходную струну. Это было сделано так, чтобы эти строковые экземпляры могли кэшироваться. Типичная программа содержит много строковых ссылок, и кэширующий эти экземпляры может уменьшить объем потребляемой памяти и увеличить производительность программы.

При использовании == оператор для сравнения строк Вы не сравниваете содержание строки, но на самом деле сравниваете адрес памяти. Если они будут оба равны, то это возвратит истину и ложь иначе. Принимая во внимание, что равняется в строке, сравнивает строковое содержание.

, Таким образом, вопрос состоит в том, если все строки кэшируются в системе, каким образом == возвращает false, тогда как равняется, возвращают true? Ну, это возможно. При создании новой строки как String str = new String("Testing"), Вы заканчиваете тем, что создали новую строку в кэше, даже если кэш уже содержит строку, имеющую то же содержание. В коротком "MyString" == new String("MyString") будет всегда возвращать false.

Java также говорит о функциональном интерне (), который может использоваться на строке для создания его, часть кэша так "MyString" == new String("MyString").intern() возвратит true.

Примечание: == оператор намного быстрее, чем равняется просто, потому что Вы сравниваете два адреса памяти, но необходимо быть уверены, что код не создает новые Строковые экземпляры в коде. Иначе Вы встретитесь с ошибками.

5
задан Lehane 19 August 2009 в 17:16
поделиться

1 ответ

Почему бы просто не передать файл свойств в качестве аргумента вашему основному методу? Таким образом, вы можете загрузить свойства следующим образом:

public static void main(String[] args) throws IOException {
  Properties props = new Properties();
  props.load(new BufferedReader(new FileReader(args[0])));
  System.setProperties(props);
}

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

CodeSource codeSource = MyClass.class.getProtectionDomain().getCodeSource();
File jarFile = new File(codeSource.getLocation().toURI().getPath());
File jarDir = jarFile.getParentFile();

if (jarDir != null && jarDir.isDirectory()) {
  File propFile = new File(jarDir, "myFile.properties");
}

... где MyClass это класс из вашего jar-файла. Однако я бы не рекомендовал это - что, если ваше приложение имеет несколько экземпляров MyClass в пути к классам в разных файлах jar (каждый jar находится в другом каталоге)? т.е. вы никогда не можете действительно гарантировать, что MyClass был загружен из банка, который, как вы думаете, был загружен.

13
ответ дан 18 December 2019 в 14:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: