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
됩니다.