Цикл статей «Учебник Java 8».
Следующая статья — «Java 8 регулярные выражения».
Предыдущая статья — «Java 8 многопоточность».
java.util.Properties
java.util.Properties — это специальный класс для хранения настроек в виде ключ-значение. И ключ и значение являются строками. Класс предоставляет методы для:
- Загрузки пар ключ-значение из потока.
- Получение значения по ключу.
- Получение списка всех ключей и значений.
- Проход по всем ключам.
- Сохранение настроек в поток.
Обратитесь к статье «Java 8 потоки ввода/вывода», чтобы узнать больше про потоки.
Класс java.util.Properties расширяет класс java.util.Hashtable. Некоторые методы, которые он унаследовал от него поддерживают следующие действия:
- Проверка существования указанного ключа или значения в объекте Properties.
- Получение количества пар ключ-значение в нашем объекте Properties.
- Удаление ключа и его значения.
- Добавление ключа со значением.
- Проход по ключам или значениям.
- Получение значения по ключу.
- Проверка Properties на пустоту.
Пример загрузки настроек из файла:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
. . . // Загрузка настроек по умолчанию Properties defaultProps = new Properties(); FileInputStream in = new FileInputStream("defaultProperties"); defaultProps.load(in); in.close(); // Создаём текущие настройки приложения с настройками по умолчанию Properties applicationProps = new Properties(defaultProps); // Загружаем новые значения // from last invocation in = new FileInputStream("appProperties"); applicationProps.load(in); in.close(); . . . |
Пример сохранения настроек в файл:
1 2 3 |
FileOutputStream out = new FileOutputStream("appProperties"); applicationProps.store(out, "---No Comment---"); out.close(); |
Полезные методы класса java.util.Properties :
1 |
public boolean contains(Object value) |
Возвращает true, если значение value присутствует в Properties.
1 |
public boolean containsKey(Object key) |
Возвращает true, если ключ key присутствует в Properties.
1 |
public String getProperty(String key) |
Возвращает значение по ключу. Если такой ключ не найден в списке свойств и в списке свойств по умолчанию, то возвращается null.
1 2 |
public String getProperty(String key, String defaultValue) |
Возвращает значение по ключу. Если такой ключ не найден в списке свойств и в списке свойств по умолчанию, то возвращается defaultValue.
1 |
public void list(PrintStream out) |
Пишет список настроек в PrintStream. Полезно для отладки.
1 |
public void list(PrintWriter out) |
Пишет список настроек в PrintWriter. Полезно для отладки.
1 |
public Enumeration<V> elements() |
Возвращает объект для последовательного перебора элементов.
1 |
public Enumeration<K> keys() |
Возвращает объект для последовательного перебора ключей.
1 |
public Enumeration<?> propertyNames() |
Возвращает объект для перечисления всех ключей настроек, включая настройки из списка настроек по умолчанию.
1 |
public Set<String> stringPropertyNames() |
Возвращает множество всех ключей настроек, включая настройки из списка настроек по умолчанию.
1 |
public int size() |
Возвращает количество элементов в Properties .
1 |
public Object setProperty(String key, String value) |
Устанавливает/добавляет значение для ключа.
1 |
public V remove(Object key) |
Удаляет пару ключ-значение из списка настроек.
Класс java.lang.System предоставляет объект java.util.Properties , который определяет конфигурацию текущей среды. Их можно получить с помощью метода System.getProperty или System.getProperties. Пример:
1 2 3 |
String separator = System.getProperty("path.separator"); java.util.Properties props = System.getProperties(); |
С помощью метода setProperty можно поменять значение какой-либо из настроек, но это крайне не рекомендуется. Большая часть значений приведена только в информационных целях. Она не перечитывается после инициализации и не сохраняется для последующих запусков при изменении.
Список основных настроек:
Key | Meaning |
---|---|
"file.separator" |
Символ, который разделяет компоненты пути файлов в системе. Это "/" в UNIX и "\" в Windows. |
"java.class.path" |
Путь, который используется для поиска каталогов и JAR-архивов, содержащих файлы «.class». Элементы пути разделяются специфичным для платформы символом, указанным в свойстве path.separator. |
"java.home" |
Каталог, в который установлена Java Runtime Environment (JRE) |
"java.vendor" |
Производитель JRE |
"java.vendor.url" |
Адрес сайта производителя JRE |
"java.version" |
Версия JRE |
"line.separator" |
Последовательность символов, используемая операционной системой в качестве разделителя строк в текстовых файлов. |
"os.arch" |
Архитектура операционной системы. |
"os.name" |
Название операционной системы. |
"os.version" |
Версия операционной системы |
"path.separator" |
Символ разделителя пути, используемый в java.class.path |
"user.dir" |
Рабочий каталог пользователя |
"user.home" |
Домашний каталог пользователя |
"user.name" |
Имя аккаунта пользователя |
Аргументы командной строки
Приложение на Java может принимать любое количество аргументов с командной строки. Это позволяет пользователю указать необходимую конфигурационною информацию при запуске приложения.
Пользователь вводит аргументы командной строки при вызове приложения и указывает их после имени запускаемого класса. Например, приложением Sort сортирует строки в файле. Для сортировки файла «frients.txt» пользователь может ввести:
1 |
java Sort friends.txt |
Приложение получает аргументы командной строки в массиве строк метода main.
Следующая программа выводит в консоль аргументы командной строки, каждый аргумент на выводится на отдельной строке:
1 2 3 4 5 6 7 |
public class Echo { public static void main (String[] args) { for (String s: args) { System.out.println(s); } } } |
Если пользователь запустит программу так:
1 |
java Echo Drink Hot Java |
То вывод будет таким:
1 2 3 |
Drink Hot Java |
Каждое слово вывелось на отдельной строке, потому что пробел разделяет аргументы командной строки, в результате каждое слово оказалось в отдельном аргументе. Чтобы получить все слова в одном аргументе пользователь должен заключить их в кавычки:
1 |
java Echo "Drink Hot Java" |
Переменные окружения
Многие операционные системы используют переменные окружения для передачи информации в приложения.
Переменные окружения представляют собой пары ключ-значение, где ключ и значение — строки. Установки и использование переменных окружения значительно различается в операционных системах и не будет рассмотрена здесь.
С помощью метода
System.getenv приложение может получить переменные окружения. Метод без аргумента возвращает экземпляр
java.util.Map, который можно использовать только для чтения, но нельзя изменять.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 |
import java.util.Map; public class EnvMap { public static void main (String[] args) { Map<String, String> env = System.getenv(); for (String envName : env.keySet()) { System.out.format("%s=%s%n", envName, env.get(envName)); } } } |
С аргументом типа String метод getenv возвращает значение указанной переменной окружения. Если переменная не указана, то возвращается null. Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Env { public static void main (String[] args) { for (String env: args) { String value = System.getenv(env); if (value != null) { System.out.format("%s=%s%n", env, value); } else { System.out.format("%s is" + " not assigned.%n", env); } } } } |
При использовании объекта java.lang.ProcessBuilder для создания нового процесса множество переменных окружения, передающихся в новый процесс, такое же, что из получено процессов виртуальной машины Java. Программа может поменять это множество с помощью ProcessBuilder.environment.
java.lang.SecurityManager
Объект java.lang.SecurityManager определяет политику безопасности для приложения, которая определяет, какие действия безопасны, а какие нет. Любые действия, которые не разрешены политикой безопасности, приводят к исключению java.lang.SecurityException. Приложение может запросить у SecurityManager-а, какие действия разрешены, а какие нет.
Обычно Java-апплет работает с SecurityManager-ом, предоставленным браузером или плагином Java Web Start Plugin. Другие типы приложений обычно работают без SecurityManager-а, разве что приложение само не объявит его. Если нет SecurityManager-а, то приложение не имеет политики безопасности и работает без ограничений.
Приложение может получить ссылку на java.lang.SecurityManager используя следующий код:
1 |
SecurityManager appsm = System.getSecurityManager(); |
Если нет SecurityManager-а, то метод вернёт null.
После получения ссылка на объект менеджера безопасности, приложение может запросить разрешение сделать что-либо. Многие классы в стандартных библиотеках делают это. Например, System.exit, который завершает виртуальную машину Java с кодом выхода, вызывает SecurityManager.checkExit, чтобы убедиться, что текущий поток имеет разрешение на завершение работы приложения.
Класс java.lang.SecurityManager имеет много других методов. Например, SecurityManager.checkAccess проверяет разрешения потока, SecurityManager.checkPropertyAccess проверяет возможность доступа к указанному свойству системы.
Другие методы класса System
1 |
public static long currentTimeMillis() |
Возвращает текущее время в миллисекундах с 1 января 1970 года.
1 |
public static void exit(int status) |
Аналогично Runtime.getRuntime().exit(status). Завершает работу виртуальной машины Java с указанным статусом. По соглашению 0 означает успешную работу, статус отличный от нуля — ошибку.
Переменная CLASSPATH
Переменная окружения CLASSPATH указывает на пути, в которых нужно будут искаться классы пользователя. Лучший способ указать путь к классам — это использовать аргумент командной строки -cp , что позволяет указать CLASSPATH индивидуально для каждого приложения.
Значение по умолчанию ".", которое означает, что поиск будет происходить только в текущем каталоге. Указание переменной CLASSPATH или аргумента командной строк -cp переопределяет это значение.
Цикл статей «Учебник Java 8».
Следующая статья — «Java 8 регулярные выражения».
Предыдущая статья — «Java 8 многопоточность».