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