답변:
당신이 사용할 수있는:
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 "을 참조하십시오 . "
isWindows
경우 isUnix
, 등 의 값을 캐시하십시오 . 이렇게하면 문자열 비교 시간도 절약됩니다.
위 답변의 일부 링크가 끊어진 것 같습니다. 아래 코드에 현재 소스 코드에 대한 포인터를 추가했으며 결과를 평가할 때 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 () ...)를 결정하는 정적 메소드가 있습니다.
예:
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
됩니다.
오픈 소스 프로젝트가 이와 같은 작업을 수행하는 방법에 관심이 있다면이 정크를 처리하는 Terracotta 클래스 (Os.java)를 확인할 수 있습니다.
그리고 JVM 버전 (Vm.java 및 VmVersion.java)을 처리하는 비슷한 클래스를 여기에서 볼 수 있습니다.
toLowerCase
가 있습니다. 로캘을 지정하지 않고 사용
이 프로젝트에서 가져온 https://github.com/RishiGupta12/serial-communication-manager
String osName = System.getProperty("os.name");
String osNameMatch = osName.toLowerCase();
if(osNameMatch.contains("linux")) {
osType = OS_LINUX;
}else if(osNameMatch.contains("windows")) {
osType = OS_WINDOWS;
}else if(osNameMatch.contains("solaris") || osNameMatch.contains("sunos")) {
osType = OS_SOLARIS;
}else if(osNameMatch.contains("mac os") || osNameMatch.contains("macos") || osNameMatch.contains("darwin")) {
osType = OS_MAC_OS_X;
}else {
}
아래 코드는 시스템 API에서 얻을 수있는 값과이 API를 통해 얻을 수있는 모든 값을 보여줍니다.
public class App {
public static void main( String[] args ) {
//Operating system name
System.out.println(System.getProperty("os.name"));
//Operating system version
System.out.println(System.getProperty("os.version"));
//Path separator character used in java.class.path
System.out.println(System.getProperty("path.separator"));
//User working directory
System.out.println(System.getProperty("user.dir"));
//User home directory
System.out.println(System.getProperty("user.home"));
//User account name
System.out.println(System.getProperty("user.name"));
//Operating system architecture
System.out.println(System.getProperty("os.arch"));
//Sequence used by operating system to separate lines in text files
System.out.println(System.getProperty("line.separator"));
System.out.println(System.getProperty("java.version")); //JRE version number
System.out.println(System.getProperty("java.vendor.url")); //JRE vendor URL
System.out.println(System.getProperty("java.vendor")); //JRE vendor name
System.out.println(System.getProperty("java.home")); //Installation directory for Java Runtime Environment (JRE)
System.out.println(System.getProperty("java.class.path"));
System.out.println(System.getProperty("file.separator"));
}
}
대답:-
Windows 7
6.1
;
C:\Users\user\Documents\workspace-eclipse\JavaExample
C:\Users\user
user
amd64
1.7.0_71
http://java.oracle.com/
Oracle Corporation
C:\Program Files\Java\jre7
C:\Users\user\Documents\workspace-Eclipse\JavaExample\target\classes
\
다음은 더 적은 라인으로 더 넓은 범위를 제공 할 수 있다고 생각합니다.
import org.apache.commons.exec.OS;
if (OS.isFamilyWindows()){
//load some property
}
else if (OS.isFamilyUnix()){
//load some other property
}
자세한 내용은 https://commons.apache.org/proper/commons-exec/apidocs/org/apache/commons/exec/OS.html
sun.awt.OSInfo # getOSType () 메소드를 사용할 수 있습니다
보안에 민감한 환경에서 작업하는 경우이 내용을 읽어보십시오.
System#getProperty(String)
서브 루틴을 통해 얻은 자산을 절대 신뢰하지 마십시오 ! 사실, 거의 포함한 모든 재산 os.arch
, os.name
및os.version
당신이 기대하는 것 같은 읽기 전용되지 않습니다 - 대신, 그들은 실제로는 정반대입니다.
우선, System#setProperty(String, String)
서브 루틴 을 호출 할 수있는 충분한 권한이있는 코드 는 반환 된 리터럴을 마음대로 수정할 수 있습니다. 이 소위의 사용을 통해 해결 될 수있는 그러나, 여기 반드시 기본 문제 아니에요 SecurityManager
을보다 상세하게 설명 된 바와 같이, 여기 .
실제 문제는 모든 사용자가 문제를 실행할 때 이러한 속성을 편집 할 수 있다는 것 JAR
입니다. 즉 , 이러한 속성이 실제로 정확한지 확인할 방법 이 없습니다 . 이로 인해 다음은 변조 방지를위한 몇 가지 추가 검사입니다.
// The first thing we're able to do is to query the filesystem.
switch (java.io.File.separator)
{
case "/":
// Windows is a potential candidate.
break;
case "\\":
// And here it could really be anything else.
break;
default:
// There's probably something really wrong here by now.
break;
}
또 다른 좋은 아이디어는 운영 체제 별 디렉토리가 있는지 확인하는 것입니다. 어떤 접근 방식을 사용하든 Java 언어는 크로스 플랫폼이 될 수 있습니다. 그렇다면 왜 그렇게하려고하지 않습니까?
볼프강의 대답이 마음에 들었습니다.
그래서 나는 그것을 나 자신을 위해 약간 표현했고 그것을 공유하려고 생각했습니다 :)
/**
* types of Operating Systems
*
* please keep the note below as a pseudo-license
*
* helper class to check the operating system this Java VM runs in
* 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
*/
public enum OSType {
MacOS("mac", "darwin"),
Windows("win"),
Linux("nux"),
Other("generic");
private static OSType detectedOS;
private final String[] keys;
private OSType(String... keys) {
this.keys = keys;
}
private boolean match(String osKey) {
for (int i = 0; i < keys.length; i++) {
if (osKey.indexOf(keys[i]) != -1)
return true;
}
return false;
}
public static OSType getOS_Type() {
if (detectedOS == null)
detectedOS = getOperatingSystemType(System.getProperty("os.name", Other.keys[0]).toLowerCase());
return detectedOS;
}
private static OSType getOperatingSystemType(String osKey) {
for (OSType osType : values()) {
if (osType.match(osKey))
return osType;
}
return Other;
}
}
이 시스템 코드는 시스템 운영 체제 유형, 이름, Java 정보 등에 대한 모든 정보를 표시합니다.
public static void main(String[] args) {
// TODO Auto-generated method stub
Properties pro = System.getProperties();
for(Object obj : pro.keySet()){
System.out.println(" System "+(String)obj+" : "+System.getProperty((String)obj));
}
}
com.sun.jna.Platform 클래스에서 다음과 같은 유용한 정적 메소드를 찾을 수 있습니다
Platform.isWindows();
Platform.is64Bit();
Platform.isIntel();
Platform.isARM();
그리고 훨씬 더.
Maven을 사용하는 경우 종속성을 추가하십시오.
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.2.0</version>
</dependency>
그렇지 않으면 jna 라이브러리 jar 파일 (예 : jna-5.2.0.jar)을 찾아 classpath에 추가하십시오.
Windows 10
하고 있지만 아직os.name
나에게 준다Windows 8.1
. 왜 그런 겁니까? 이것은 어디에서 오는가?