Wie bestimme ich programmgesteuert das Betriebssystem in Java?

Lesezeit: 6 Minuten

Wie bestimme ich programmgesteuert das Betriebssystem in Java
karlgrz

Ich möchte das Betriebssystem des Hosts bestimmen, auf dem mein Java-Programm programmgesteuert ausgeführt wird (zum Beispiel: Ich möchte in der Lage sein, verschiedene Eigenschaften zu laden, je nachdem, ob ich mich auf einer Windows- oder Unix-Plattform befinde). Was ist der sicherste Weg, dies mit 100% Zuverlässigkeit zu tun?

Wie bestimme ich programmgesteuert das Betriebssystem in Java
Chris Jester-Young

Sie können Folgendes verwenden:

System.getProperty("os.name")

PS Möglicherweise finden Sie diesen Code nützlich:

class ShowProperties {
    public static void main(String[] args) {
        System.getProperties().list(System.out);
    }
}

Es gibt lediglich alle Eigenschaften aus, die von Ihren Java-Implementierungen bereitgestellt werden. Es gibt Ihnen eine Vorstellung davon, was Sie über Eigenschaften über Ihre Java-Umgebung herausfinden können. 🙂

  • Ich benutze Windows 10 und doch os.name gibt mir Windows 8.1. Warum ist das so? Wo kommt das her?

    – Brian

    7. Februar 2016 um 19:59 Uhr

  • nvm gefunden stackoverflow.com/questions/31909107/…

    – Brian

    7. Februar 2016 um 20:00 Uhr

Wie bestimme ich programmgesteuert das Betriebssystem in Java
Leif Karlsen

Wie in anderen Antworten angegeben, stellt System.getProperty die Rohdaten bereit. Allerdings ist die Apache Commons Lang-Komponente bietet ein Wrapper für java.lang.System mit praktischen Eigenschaften wie SystemUtils.IS_OS_WINDOWSähnlich wie das oben erwähnte Swingx OS util.

  • Das ist wirklich praktisch. Sie entdecken jeden Tag neue Funktionen in Apache Lang3!

    – Robin Jonsson

    8. September 2016 um 7:28 Uhr

1646351829 468 Wie bestimme ich programmgesteuert das Betriebssystem in Java
VonC

Okt. 2008:

Ich würde empfehlen, es in einer statischen Variablen zwischenzuspeichern:

public static final class OsUtils
{
   private static String OS = null;
   public static String getOsName()
   {
      if(OS == null) { OS = System.getProperty("os.name"); }
      return OS;
   }
   public static boolean isWindows()
   {
      return getOsName().startsWith("Windows");
   }

   public static boolean isUnix() // and so on
}

Auf diese Weise rufen Sie die Eigenschaft jedes Mal, wenn Sie nach dem Os fragen, nicht mehr als einmal in der Lebensdauer Ihrer Anwendung ab.


Februar 2016: 7+ Jahre später:

Es gibt einen Fehler mit Windows 10 (der zum Zeitpunkt der ursprünglichen Antwort nicht existierte).
Siehe „Javas „os.name“ für Windows 10?“

  • Ich stimme der getOSName-Funktion auf der Grundlage von OAOO zu (einmalig und nur einmal); Das Caching ist jedoch angesichts der Geschwindigkeit von Hash-Lookups völlig überflüssig.

    – Chris Jester-Young

    23. Oktober 2008 um 4:02 Uhr

  • Völlig redundant könnte ein bisschen hart sein, Hash-Lookups sind teurer als der Zugriff auf eine Referenz. Es hängt alles vom Kontext ab.

    – Craig-Tag

    23. Oktober 2008 um 4:04 Uhr

  • Gute Punkte … Fühlen Sie sich frei, abzustimmen, wenn Sie denken, dass es eine schlechte Praxis ist;)

    – VonC

    23. Oktober 2008 um 4:10 Uhr

  • Ich habe diese Antwort noch einmal gelesen. Wenn Sie cachen wollen, cachen Sie die Werte von isWindows, isUnixusw. Auf diese Weise sparen Sie auch Zeit für den Zeichenfolgenvergleich.

    – Chris Jester-Young

    19. März 2015 um 14:48 Uhr

  • @ Brian stimmt. Ich habe diese sehr alte Antwort entsprechend bearbeitet, um auf die neuere zu verweisen.

    – VonC

    7. Februar 2016 um 20:18 Uhr

1646351829 711 Wie bestimme ich programmgesteuert das Betriebssystem in Java
Wolfgang Fahl

Einige der Links in den obigen Antworten scheinen defekt zu sein. Ich habe im folgenden Code Verweise auf aktuellen Quellcode hinzugefügt und biete einen Ansatz zur Behandlung der Prüfung mit einem Enum als Antwort, damit bei der Auswertung des Ergebnisses eine switch-Anweisung verwendet werden kann:

OsCheck.OSType ostype=OsCheck.getOperatingSystemType();
switch (ostype) {
    case Windows: break;
    case MacOS: break;
    case Linux: break;
    case Other: break;
}

Die Hilfsklasse ist:

/**
 * helper class to check the operating system this Java VM runs in
 *
 * please keep the notes below as a pseudo-license
 *
 * http://stackoverflow.com/questions/228477/how-do-i-programmatically-determine-operating-system-in-java
 * compare to http://svn.terracotta.org/svn/tc/dso/tags/2.6.4/code/base/common/src/com/tc/util/runtime/Os.java
 * http://www.docjar.com/html/api/org/apache/commons/lang/SystemUtils.java.html
 */
import java.util.Locale;
public static final class OsCheck {
  /**
   * types of Operating Systems
   */
  public enum OSType {
    Windows, MacOS, Linux, Other
  };

  // cached result of OS detection
  protected static OSType detectedOS;

  /**
   * detect the operating system from the os.name System property and cache
   * the result
   * 
   * @returns - the operating system detected
   */
  public static OSType getOperatingSystemType() {
    if (detectedOS == null) {
      String OS = System.getProperty("os.name", "generic").toLowerCase(Locale.ENGLISH);
      if ((OS.indexOf("mac") >= 0) || (OS.indexOf("darwin") >= 0)) {
        detectedOS = OSType.MacOS;
      } else if (OS.indexOf("win") >= 0) {
        detectedOS = OSType.Windows;
      } else if (OS.indexOf("nux") >= 0) {
        detectedOS = OSType.Linux;
      } else {
        detectedOS = OSType.Other;
      }
    }
    return detectedOS;
  }
}

Kopieren von Dateien von einem Verzeichnis in ein anderes in
Igor Rybak

Die folgenden JavaFX-Klassen haben statische Methoden, um das aktuelle Betriebssystem zu bestimmen (isWindows(),isLinux()…):

  • com.sun.javafx.PlatformUtil
  • com.sun.media.jfxmediaimpl.HostUtils
  • com.sun.javafx.util.Utils

Beispiel:

if (PlatformUtil.isWindows()){
           ...
}

  • diese sollte höher sein

    – Lebensräume

    19. März 2017 um 22:00 Uhr

  • Bitte beachten Sie, dass der Zugriff auf “com/sun/javafx/*” jetzt abgeraten wird (überprüft mit JDK 1.8.0_121).

    – Michael Marton

    14. Januar 2018 um 12:27 Uhr

  • @MichaelMarton Haben Sie eine Referenz für Ihre Aussage?

    – Hummeling Engineering BV

    10. Juli 2018 um 9:07 Uhr

  • @HummelingEngineeringBV: Ich denke, es war ein Fehler von meiner Seite. Ich arbeite mit Eclipse Neon 4.6.3 und der „Java Build Path“ zeigt mehrere „Discouraged: com/sun/javafx/**“-Warnungen an. Wie ich jedoch herausgefunden habe, handelt es sich hierbei um einen Eclipse-Bug und/oder -Feature (siehe Link).

    – Michael Marton

    11. Juli 2018 um 11:01 Uhr

  • Ich muss mich noch einmal korrigieren. Ab Java 9/10+ werden mehrere „com.sun.*“-Pakete/APIs entfernt. Kasse dieser Link Für mehr Information. Ich bin tatsächlich darüber gestolpert, weil wir einige dieser Pakete verwenden. Bei der Migration zu Eclipse 4.8/JDK 10 müssen wir nun diese und mehrere andere Compilerfehler aufgrund fehlender Referenzen beheben.

    – Michael Marton

    16. August 2018 um 20:00 Uhr


TL;DR

Für den Zugriff auf das Betriebssystem verwenden Sie: System.getProperty("os.name").


Aber warte!!!

Warum nicht eine Utility-Klasse erstellen, sie wiederverwendbar machen! Und wahrscheinlich viel schneller bei mehreren Anrufen. Sauber, klar, schneller!

Erstellen Sie eine Util-Klasse für solche Hilfsfunktionen. Erstellen Sie dann öffentliche Aufzählungen für jeden Betriebssystemtyp.

public class Util {     
        public enum OS {
            WINDOWS, LINUX, MAC, SOLARIS
        };// Operating systems.

    private static OS os = null;

    public static OS getOS() {
        if (os == null) {
            String operSys = System.getProperty("os.name").toLowerCase();
            if (operSys.contains("win")) {
                os = OS.WINDOWS;
            } else if (operSys.contains("nix") || operSys.contains("nux")
                    || operSys.contains("aix")) {
                os = OS.LINUX;
            } else if (operSys.contains("mac")) {
                os = OS.MAC;
            } else if (operSys.contains("sunos")) {
                os = OS.SOLARIS;
            }
        }
        return os;
    }
}

Jetzt können Sie ganz einfach eine Klasse aus jeder Klasse wie folgt aufrufen (PS Da wir die Variable os als statisch deklariert haben, wird sie nur einmal Zeit benötigen, um den Systemtyp zu identifizieren, und kann dann verwendet werden, bis Ihre Anwendung anhält.)

            switch (Util.getOS()) {
            case WINDOWS:
                //do windows stuff
                break;
            case LINUX:

und das ist alles!

  • diese sollte höher sein

    – Lebensräume

    19. März 2017 um 22:00 Uhr

  • Bitte beachten Sie, dass der Zugriff auf “com/sun/javafx/*” jetzt abgeraten wird (überprüft mit JDK 1.8.0_121).

    – Michael Marton

    14. Januar 2018 um 12:27 Uhr

  • @MichaelMarton Haben Sie eine Referenz für Ihre Aussage?

    – Hummeling Engineering BV

    10. Juli 2018 um 9:07 Uhr

  • @HummelingEngineeringBV: Ich denke, es war ein Fehler von meiner Seite. Ich arbeite mit Eclipse Neon 4.6.3 und der „Java Build Path“ zeigt mehrere „Discouraged: com/sun/javafx/**“-Warnungen an. Wie ich jedoch herausgefunden habe, handelt es sich hierbei um einen Eclipse-Bug und/oder -Feature (siehe Link).

    – Michael Marton

    11. Juli 2018 um 11:01 Uhr

  • Ich muss mich noch einmal korrigieren. Ab Java 9/10+ werden mehrere „com.sun.*“-Pakete/APIs entfernt. Kasse dieser Link Für mehr Information. Ich bin tatsächlich darüber gestolpert, weil wir einige dieser Pakete verwenden. Bei der Migration zu Eclipse 4.8/JDK 10 müssen wir nun diese und mehrere andere Compilerfehler aufgrund fehlender Referenzen beheben.

    – Michael Marton

    16. August 2018 um 20:00 Uhr


1646351830 298 Wie bestimme ich programmgesteuert das Betriebssystem in Java
Theikon

Ein kleines Beispiel dafür, was Sie erreichen möchten, wäre wahrscheinlich a class ähnlich wie darunter:

import java.util.Locale;

public class OperatingSystem
{
    private static String OS = System.getProperty("os.name", "unknown").toLowerCase(Locale.ROOT);

    public static boolean isWindows()
    {
        return OS.contains("win");
    }

    public static boolean isMac()
    {
        return OS.contains("mac");
    }

    public static boolean isUnix()
    {
        return OS.contains("nux");
    }
}

Diese spezielle Implementierung ist ziemlich zuverlässig und sollte universell anwendbar sein. Kopieren Sie es einfach und fügen Sie es in Ihre ein class nach Wahl.

928780cookie-checkWie bestimme ich programmgesteuert das Betriebssystem in Java?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy