[java] Java로 운영 체제를 프로그래밍 방식으로 결정하려면 어떻게합니까?

Java 프로그램이 프로그래밍 방식으로 실행중인 호스트의 운영 체제를 결정하고 싶습니다 (예 : Windows 또는 Unix 플랫폼인지 여부에 따라 다른 속성을로드 할 수 있기를 원합니다). 100 % 신뢰도로이를 수행하는 가장 안전한 방법은 무엇입니까?



답변

당신이 사용할 수있는:

System.getProperty("os.name")

추신 :이 코드가 유용 할 것입니다 :

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

Java 구현에서 제공하는 모든 속성을 인쇄하기 만하면됩니다. 속성을 통해 Java 환경에 대한 정보를 얻을 수 있습니다. 🙂


답변

다른 답변에 표시된 것처럼 System.getProperty는 원시 데이터를 제공합니다. 그러나 Apache Commons Lang 구성 요소 는 앞에서 언급 한 Swingx OS 유틸리티와 매우 유사한 편리한 특성을 가진 java.lang.System에 대한 랩퍼를 제공합니다 SystemUtils.IS_OS_WINDOWS.


답변

2008 년 10 월 :

정적 변수로 캐시하는 것이 좋습니다.

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
}

이렇게하면 Os를 요청할 때마다 응용 프로그램 수명 동안 속성을 두 번 이상 가져 오지 않습니다.


2016 년 2 월 : 7 년 이상 후 :

Windows 10에는 버그가 있습니다 (원래 답변 당시에는 존재하지 않았 음).
Windows 10 용 Java의”os.name “을 참조하십시오 .


답변

위 답변의 일부 링크가 끊어진 것 같습니다. 아래 코드에 현재 소스 코드에 대한 포인터를 추가했으며 결과를 평가할 때 switch 문을 사용할 수 있도록 열거 형으로 검사를 처리하는 방법을 제공합니다.

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

도우미 클래스는 다음과 같습니다.

/**
 * 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;
  }
}


답변

다음 JavaFX 클래스에는 현재 OS (isWindows (), isLinux () …)를 결정하는 정적 메소드가 있습니다.

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

예:

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


답변

TL; DR

OS에 액세스하려면 : System.getProperty("os.name").


그러나 유틸리티 클래스를 작성하여 재사용 가능하게 만드십시오! 여러 통화에서 훨씬 빠릅니다. 깨끗하고 깨끗하며 빠릅니다!

이러한 유틸리티 함수에 대한 Util 클래스를 작성하십시오. 그런 다음 각 운영 체제 유형에 대한 공개 열거 형을 만듭니다.

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;
    }
}

이제 다음과 같이 모든 클래스에서 클래스를 쉽게 호출 할 수 있습니다.

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

그게 다야!


답변

달성하려는 작은 예는 아마도 class아래의 것과 비슷할 것입니다 .

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");
    }
}

이 특정 구현은 매우 안정적이며 보편적으로 적용 가능해야합니다. 원하는대로 복사하여 붙여 넣기 만하면 class됩니다.