Gostaria de determinar o sistema operacional do host que meu programa Java está executando programaticamente (por exemplo: gostaria de poder carregar propriedades diferentes, dependendo de eu estar em uma plataforma Windows ou Unix). Qual é a maneira mais segura de fazer isso com 100% de confiabilidade?
java
operating-system
karlgrz
fonte
fonte
Windows 10
e aindaos.name
me dáWindows 8.1
. Por que é que? De onde isso vem?Conforme indicado em outras respostas, System.getProperty fornece os dados brutos. No entanto, o componente Apache Commons Lang fornece um invólucro para java.lang.System com propriedades úteis
SystemUtils.IS_OS_WINDOWS
, como o utilitário Swingx OS mencionado anteriormente.fonte
Outubro de 2008:
Eu recomendaria armazená-lo em cache em uma variável estática:
Dessa forma, toda vez que você solicitar o sistema operacional, você não buscará a propriedade mais de uma vez durante a vida útil do seu aplicativo.
Fevereiro de 2016: mais de 7 anos depois:
Há um erro no Windows 10 (que não existia no momento da resposta original).
Consulte " os.name de Java‘’para Windows 10? "
fonte
isWindows
,isUnix
, etc. Dessa forma você economiza o tempo comparação de string também.alguns dos links nas respostas acima parecem estar quebrados. Adicionei ponteiros ao código-fonte atual no código abaixo e ofereço uma abordagem para lidar com a verificação com uma enumeração como resposta, para que uma instrução switch possa ser usada ao avaliar o resultado:
A classe auxiliar é:
fonte
As seguintes classes JavaFX possuem métodos estáticos para determinar o SO atual (isWindows (), isLinux () ...):
Exemplo:
fonte
TL; DR
Para acessar o uso OS:
System.getProperty("os.name")
.Mas por que não criar uma classe de utilidade, torne-a reutilizável! E provavelmente muito mais rápido em várias chamadas. Limpo, claro, mais rápido!
Crie uma classe Util para essas funções utilitárias. Em seguida, crie enumerações públicas para cada tipo de sistema operacional.
Agora, você pode invocar facilmente a classe de qualquer classe da seguinte maneira (PS: Como declaramos a variável os como estática, ele consumirá tempo apenas uma vez para identificar o tipo de sistema e poderá ser usado até que o aplicativo pare.)
e é isso aí!
fonte
Um pequeno exemplo do que você está tentando alcançar provavelmente seria
class
semelhante ao que está abaixo:Essa implementação específica é bastante confiável e deve ser universalmente aplicável. Basta copiar e colar na sua
class
escolha.fonte
Se você estiver interessado em saber como um projeto de código aberto faz coisas como essa, confira a classe Terracotta (Os.java) que lida com esse lixo aqui:
http://svn.terracotta.org/svn/tc/dso/trunk/code/base/common/src/com/tc/util/runtime/E você pode ver uma classe semelhante para lidar com versões da JVM (Vm.java e VmVersion.java) aqui:
fonte
toLowerCase
sem especificar uma localidadeExperimente isso, simples e fácil
fonte
Retirado deste projeto https://github.com/RishiGupta12/serial-communication-manager
fonte
O código abaixo mostra os valores que você pode obter da API do sistema, tudo o que você pode obter com essa API.
Respostas: -
fonte
Acho que o OS Utils da Swingx faz o trabalho.
fonte
Eu acho que a seguir pode dar uma cobertura mais ampla em menos linhas
Mais detalhes aqui: https://commons.apache.org/proper/commons-exec/apidocs/org/apache/commons/exec/OS.html
fonte
fonte
Você pode apenas usar o método sun.awt.OSInfo # getOSType ()
fonte
Se você estiver trabalhando em um ambiente sensível à segurança, leia isso.
Evite sempre confiar em um imóvel obtido através da
System#getProperty(String)
sub - rotina! Na verdade, quase todas as propriedadesos.arch
, incluindo ,,os.name
eos.version
não são apenas de leitura, como seria de esperar - em vez disso, elas são exatamente o oposto.Antes de tudo, qualquer código com permissão suficiente para chamar a
System#setProperty(String, String)
sub - rotina pode modificar o literal retornado à vontade. No entanto, essa não é necessariamente a questão principal aqui, pois ela pode ser resolvida com o uso de uma chamadaSecurityManager
, conforme descrito em maiores detalhes aqui .O problema real é que qualquer usuário pode editar essas propriedades ao executar o
JAR
em questão. Isso significa que não há como determinar se essas propriedades são realmente precisas. Por esse motivo, seguem algumas verificações adicionais para tentar evitar a violação:Outra boa idéia é verificar a presença de diretórios específicos do sistema operacional. Qualquer que seja a abordagem que você adote, lembre-se de que a linguagem Java é recuada para ser a plataforma cruzada. Então, por que você não tenta fazer o mesmo?
fonte
Gostei da resposta de Wolfgang, só porque acredito que coisas assim devem ser consasadas ...
então reformulei um pouco para mim e pensei em compartilhá-lo :)
fonte
Este código para exibir todas as informações sobre o sistema, tipo, nome, informações sobre java e assim por diante.
fonte
Na classe com.sun.jna.Platform, você pode encontrar métodos estáticos úteis, como
e muito mais.
Se você usa o Maven, basta adicionar dependência
Caso contrário, basta encontrar o arquivo jar da biblioteca jna (por exemplo, jna-5.2.0.jar) e adicioná-lo ao classpath.
fonte
Basta usar
com.sun.javafx.util.Utils
como abaixo.OU UTILIZAÇÃO
fonte