Chciałbym określić system operacyjny hosta, który mój program Java uruchamia programowo (na przykład: Chciałbym móc ładować różne właściwości w zależności od tego, czy korzystam z platformy Windows, czy Unix). Jaki jest najbezpieczniejszy sposób, aby to zrobić przy 100% niezawodności?
java
operating-system
karlgrz
źródło
źródło
Windows 10
a jednakos.name
daje miWindows 8.1
. Dlaczego? Skąd to się bierze?Jak wskazano w innych odpowiedziach, System.getProperty zapewnia surowe dane. Jednak składnik Apache Commons Lang zapewnia opakowanie dla java.lang.System z przydatnymi właściwościami, takimi jak
SystemUtils.IS_OS_WINDOWS
, podobnie jak wyżej wspomniane użycie Swingx OS.źródło
Październik 2008:
Polecam buforowanie go w zmiennej statycznej:
W ten sposób za każdym razem, gdy poprosisz o system operacyjny, nie pobierzesz właściwości więcej niż raz w ciągu całego życia aplikacji.
Luty 2016: 7+ lata później:
Wystąpił błąd w systemie Windows 10 (który nie istniał w czasie oryginalnej odpowiedzi).
Zobacz „ Java” „os.name” dla Windows 10? ”
źródło
isWindows
,isUnix
itd ten sposób można zaoszczędzić na czasie porównania ciągów również.niektóre linki w powyższych odpowiedziach wydają się być zepsute. Dodałem wskaźniki do bieżącego kodu źródłowego w poniższym kodzie i oferuję podejście do obsługi sprawdzania z wyliczeniem jako odpowiedzią, aby można było użyć instrukcji switch podczas oceny wyniku:
Klasa pomocnicza to:
źródło
Następujące klasy JavaFX mają statyczne metody określania bieżącego systemu operacyjnego (isWindows (), isLinux () ...):
Przykład:
źródło
TL; DR
Dostępu do korzystania OS:
System.getProperty("os.name")
.Ale dlaczego nie stworzyć klasy użyteczności, spraw, aby można ją było ponownie wykorzystać! I prawdopodobnie o wiele szybciej w przypadku wielu połączeń. Czysto, czysto, szybciej!
Utwórz klasę Util dla takich funkcji narzędziowych. Następnie utwórz publiczne wyliczenia dla każdego typu systemu operacyjnego.
Teraz możesz łatwo wywoływać klasę z dowolnej klasy w następujący sposób (PS Ponieważ zadeklarowaliśmy zmienną os jako statyczną, identyfikacja typu systemu zajmie czas tylko raz, więc można jej używać do momentu zatrzymania aplikacji).
i to jest to!
źródło
Mały przykład tego, co próbujesz osiągnąć, prawdopodobnie byłby
class
podobny do tego, co poniżej:Ta konkretna implementacja jest dość niezawodna i powinna mieć uniwersalne zastosowanie. Po prostu skopiuj i wklej go do swojego
class
wyboru.źródło
Jeśli jesteś zainteresowany tym, jak projekt open source robi takie rzeczy, możesz sprawdzić klasę terakoty (Os.java), która obsługuje te śmieci tutaj:
http://svn.terracotta.org/svn/tc/dso/trunk/code/base/common/src/com/tc/util/runtime/I możesz zobaczyć podobną klasę do obsługi wersji JVM (Vm.java i VmVersion.java) tutaj:
źródło
toLowerCase
bez określenia lokalizacjiWypróbuj to, proste i łatwe
źródło
Zaczerpnięte z tego projektu https://github.com/RishiGupta12/serial-communication-manager
źródło
Poniższy kod pokazuje wartości, które można uzyskać z System API, wszystkie te rzeczy, które można uzyskać za pośrednictwem tego API.
Odpowiedzi: -
źródło
Uważam, że Utils OS Swils wykonuje pracę.
źródło
Myślę, że podążanie może dać szerszy zasięg w mniejszej liczbie linii
Więcej informacji tutaj: https://commons.apache.org/proper/commons-exec/apidocs/org/apache/commons/exec/OS.html
źródło
źródło
Możesz po prostu użyć metody sun.awt.OSInfo # getOSType ()
źródło
Jeśli pracujesz w środowisku wrażliwym na bezpieczeństwo, przeczytaj to.
Proszę, nigdy nie ufajcie nieruchomości uzyskanej za pomocą
System#getProperty(String)
podprogramu! W rzeczywistości prawie każda właściwość, w tymos.arch
,os.name
i,os.version
nie jest tylko do odczytu, jak można się spodziewać - zamiast tego są wręcz przeciwnie.Przede wszystkim każdy kod z wystarczającą zgodą na wywołanie
System#setProperty(String, String)
podprogramu może dowolnie modyfikować zwracany literał. Jednak nie jest to koniecznie główny problem, ponieważ można go rozwiązać za pomocą tak zwanegoSecurityManager
, jak opisano bardziej szczegółowo tutaj .Rzeczywistym problemem jest to, że każdy użytkownik może edytować te właściwości podczas uruchamiania danego
JAR
pytania. Oznacza to, że nie ma sposobu, aby ustalić, czy te właściwości są rzeczywiście dokładne. Z tego powodu oto kilka dodatkowych sprawdzeń, aby uniknąć manipulacji:Innym dobrym pomysłem jest sprawdzenie obecności katalogów specyficznych dla systemu operacyjnego. Niezależnie od tego, jakie podejmiesz podejście, pamiętaj, że język Java jest przeznaczony dla wielu platform. Dlaczego więc nie spróbujesz zrobić tego samego?
źródło
Podoba mi się odpowiedź Wolfganga tylko dlatego, że uważam, że takie rzeczy powinny być consts ...
więc sformułowałem to trochę dla siebie i postanowiłem to udostępnić :)
źródło
Ten kod do wyświetlania wszystkich informacji o typie systemu operacyjnego, nazwie, informacjach Java i tak dalej.
źródło
W klasie com.sun.jna.Platform można znaleźć przydatne metody statyczne, takie jak
i wiele więcej.
Jeśli używasz Maven, po prostu dodaj zależność
W przeciwnym razie po prostu znajdź plik jar biblioteki jna (np. Jna-5.2.0.jar) i dodaj go do ścieżki klasy.
źródło
Po prostu użyj
com.sun.javafx.util.Utils
jak poniżej.ALBO UŻYJ
źródło