Если вы работаете в среде, чувствительной к безопасности, пожалуйста, прочитайте это до конца.
Пожалуйста, воздержитесь от доверия к собственности, полученной с помощью System#getProperty(String)
подпрограммы! На самом деле, почти все свойства, включая os.arch
, os.name
и os.version
не только для чтения, как вы могли бы ожидать - вместо этого, они на самом деле совсем наоборот.
Прежде всего, любой код с достаточным разрешением для вызова System#setProperty(String, String)
подпрограммы может изменить возвращенный литерал по желанию. Тем не менее, это не обязательно основная проблема здесь, так как она может быть решена с помощью так называемого SecurityManager
, как описано более подробно здесь .
Фактическая проблема заключается в том, что любой пользователь может редактировать эти свойства при запуске соответствующего JAR
вопроса. Это означает, что нет способа определить, являются ли эти свойства действительно точными. Из-за этого вот несколько дополнительных проверок, чтобы попытаться избежать вмешательства:
// The first thing we're able to do is to query the filesystem.
switch (java.io.File.separator)
{
case "/":
// Windows is a potential candidate.
break;
case "\\":
// And here it could really be anything else.
break;
default:
// There's probably something really wrong here by now.
break;
}
Еще одна хорошая идея - проверить наличие каталогов, специфичных для операционной системы. Какой бы подход вы ни выбрали, помните, что язык Java предназначен для кроссплатформенности. Так почему бы тебе не попробовать сделать то же самое?
Windows 10
и все жеos.name
отдает мнеWindows 8.1
. Это почему? Откуда это?