В чём разница между передачей свойства аргументом и определением свойства в самой java программе

Можно при вызове java программы передать параметр, например, -Djava.encoding=cp866, а можно определить в самой программе System.setProperty("java.encoding", "cp866").

Какова разница между двумя случаями?
Почему в случае наличия проблемы с "кракозяброй", печатаемой в консоль, первый вариант имеет эффект, а второй никакого эффекта не имеет.


Ответы (1 шт):

Автор решения: Komdosh

В случае System.setProperty("java.encoding", "cp866") вы либо перезаписываете, либо выставляете значение данного свойства, это нужно если вы или сторонняя библиотека в дальнейшем будет использовать свойство для каких-то манипуляций например библиотека внутри смотрит на это свойство для чтения файлов, поэтому вы его перезаписали, т.к. допустим ваши файлы сохранены в cp866. Вот вы и напишите System.getProperty("java.encoding") для того, чтобы узнать в какой кодировке вам читать файлы. Хотя перезаписывать стандартные свойства очень плохая затея.

В первом случае -Djava.encoding=cp866 вы указываете аргумент запуска программы (Это простым языком, если интересно почитайте про компиляцию и инициализацию исходного кода Java, в какой момент запускается JVM и т.п.), JVM получает это свойство при запуске и может изменить своё внутреннее состояние до запуска вашего исходного кода. Т.е. она настраивается до того момента как будет исполнена ваша строка System.setProperty("java.encoding", "cp866").

→ Ссылка