मैं जावा में ऑपरेटिंग सिस्टम को प्रोग्रामेटिक रूप से कैसे निर्धारित करूं?


526

मैं मेजबान के ऑपरेटिंग सिस्टम को निर्धारित करना चाहूंगा कि मेरा जावा प्रोग्राम प्रोग्रामेटिक रूप से चल रहा है (उदाहरण के लिए: मैं विंडोज या यूनिक्स प्लेटफॉर्म पर हूं या नहीं, इसके आधार पर विभिन्न गुणों को लोड करने में सक्षम होना चाहूंगा)। 100% विश्वसनीयता के साथ ऐसा करने का सबसे सुरक्षित तरीका क्या है?

जवाबों:


617

आप उपयोग कर सकते हैं:

System.getProperty("os.name")

PS आपको यह कोड उपयोगी लग सकता है:

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

यह सब आपके जावा कार्यान्वयन द्वारा प्रदान की गई सभी संपत्तियों का प्रिंट आउट है। यह आपको गुणों के माध्यम से अपने जावा वातावरण के बारे में पता लगा सकता है। :-)


6
मैं उपयोग कर रहा हूं Windows 10और फिर भी os.nameमुझे देता है Windows 8.1। ऐसा क्यों है? यह कहां से आ रहा है?
ब्रायन


152

जैसा कि अन्य उत्तरों में संकेत दिया गया है, System.getProperty कच्चे डेटा प्रदान करता है। हालांकि, अपाचे कॉमन्स लैंग कंपोनेंट java.lang.System के लिए एक रैपर प्रदान करता है SystemUtils.IS_OS_WINDOWS, जैसे कि उपरोक्त गुणों के साथ , स्विंगएक्स ओएस के उपयोग की तरह।


2
यह वास्तव में आसान है। आप हर दिन अपाचे लैंग 3 में नई सुविधाओं की खोज करते हैं!
रॉबिन जोंसन

82

2008 अक्टूबर:

मैं इसे एक स्थिर चर में कैश करने की सलाह दूंगा:

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
}

इस तरह, हर बार जब आप ओएस के लिए पूछते हैं, तो आप अपने आवेदन के जीवनकाल में एक से अधिक बार संपत्ति नहीं लाते हैं।


फरवरी 2016: 7+ साल बाद:

विंडोज 10 के साथ एक बग है (जो मूल उत्तर के समय मौजूद नहीं था)। विंडोज 10 के लिए
" जावा का" os.name " देखें ? "


5
मैं गेटऑन फ़ंक्शन से सहमत हूं, OAOO (एक बार और केवल एक बार) के आधार पर; हालाँकि, कैशिंग पूरी तरह से निरर्थक हैश की लुक की गति को देखते हुए।
क्रिस जस्टर-यंग

6
पूरी तरह से निरर्थक थोड़ा कठोर हो सकता है, हैश लुकअप एक संदर्भ तक पहुँचने से अधिक महंगे हैं। यह सब संदर्भ पर निर्भर करता है।
क्रेग डे

2
अच्छे अंक ... अगर आपको लगता है कि यह एक बुरा अभ्यास है, तो नीचे वोट करने के लिए स्वतंत्र महसूस करें;)
VonC

5
मैं इस जवाब को फिर से लिखता हूं। आप कैश करने के लिए जा रहे हैं, तो के मूल्यों को कैश isWindows, isUnixस्ट्रिंग तुलना समय भी पर बचाने रास्ता, आदि है कि आप।
क्रिस जस्टर-यंग

2
@ ब्रायन ट्रू। मैंने इस पुराने उत्तर को उसी हिसाब से संपादित किया है, हाल के एक को संदर्भित करने के लिए।
VonC

44

उपरोक्त उत्तरों में से कुछ लिंक टूटे हुए लगते हैं। मैंने नीचे दिए गए कोड में वर्तमान स्रोत कोड में संकेत जोड़े हैं और उत्तर के रूप में एक एनम के साथ चेक को संभालने के लिए एक दृष्टिकोण प्रदान करता है ताकि परिणाम का मूल्यांकन करते समय एक स्विच स्टेटमेंट का उपयोग किया जा सके:

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

3
(OS.indexOf ("darwin")> = 0) कभी भी सच नहीं हो सकता क्योंकि यह (OS.indexOf ("जीत")> = 0) के बाद आता है
विलियम

14
ऊपर दिए गए कोड में स्थानीय मुद्दे हो सकते हैं, क्योंकि यह toLowerCase () का उपयोग करता है, जो स्थानीय संवेदनशील है। जहां यह मामला विशेष रूप से है जब मैं निचली / ऊपरी मामले में परिवर्तित कर रहा हूं, चूंकि तुर्की में, मैं निचला मामला i (ı) पूर्ववत् हो गया है, और मैं ऊपरी मामला i (İ) बन जाता है। इसलिए "WINDOWS" .toLowerCase ()। IndexOf ("जीत") तुर्की में -1 लौट आएगा। किसी विशेष भाषा के निचले मामले को करते समय हमेशा एक लोकल पास करें, जैसे कि "WINDOWS" .toLowerCase (Locale.ENGLISH) .indexOf ("जीत") तुर्की में काम करेगा।
जेम्स रोपर

@JamesRoper - thanx ने इसे ठीक किया।
वोल्फगैंग फ़ाहल


42

वर्तमान OS (isWindows (), isLinux () ...) को निर्धारित करने के लिए निम्नलिखित JavaFX कक्षाओं में स्थिर विधियां हैं:

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

उदाहरण:

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

यह अधिक होना चाहिए
निवास स्थान

3
कृपया ध्यान दें कि "com / sun / javafx / *" का उपयोग अब हतोत्साहित किया गया है (इसे JDK 1.8.0_121 के साथ जाँचें)।
माइकल मार्टन

1
@MichaelMarton अपने बयान के लिए एक संदर्भ है?
नौसिखिया इंजीनियरिंग BV

@HmelmelingEngineeringBV: मुझे लगता है कि यह मेरी तरफ से एक गलती थी। मैं ग्रहण नियॉन 4.6.3 के साथ काम कर रहा हूं और "जावा बिल्ड पाथ" कई "हतोत्साहित: कॉम / सूरज / जावफैक्स / **" चेतावनी दिखाता है। हालांकि, जैसा कि मुझे पता चला है, यह एक ग्रहण-बग और / या -feature ( लिंक देखें ) होता है।
माइकल मार्टन

2
मुझे खुद को एक बार और सही करना होगा। जावा 9/10 + से शुरू होकर, कई "com.sun। *" पैकेज / एपीआई निकाले जाने वाले हैं। की जाँच करें इस लिंक अधिक जानकारी के लिए। मैं वास्तव में इस पर ठोकर खाई क्योंकि हम इन पैकेजों में से कुछ का उपयोग करते हैं। 4.8 / JDK 10 को ग्रहण करने के लिए, अब हमें लापता संदर्भों के कारण इन और कई अन्य संकलक त्रुटियों को ठीक करना होगा।
माइकल मार्टन

16

टी एल; डॉ

ओएस के उपयोग तक पहुँचने के लिए System.getProperty("os.name"):।


लेकिन एक उपयोगिता वर्ग क्यों नहीं बनाया, इसे पुन: प्रयोज्य बनाएं! और शायद कई कॉल पर बहुत तेज। स्वच्छ, स्पष्ट, तेज!

ऐसे यूटिलिटी फंक्शन्स के लिए एक यूटिल क्लास बनाएं। फिर प्रत्येक ऑपरेटिंग सिस्टम प्रकार के लिए सार्वजनिक एनम बनाएं।

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:

और यह बात है!


2
मैं एक ओपन-सोर्स प्रोजेक्ट ( github.com/openhab/openhab-addons ) में कोड के इस टुकड़े का उपयोग करना चाहता हूं , क्या यह आपके साथ ठीक है?
कॉन्स्टी पी

हाँ कृपया इसे उपयोग करने के लिए स्वतंत्र महसूस करें।
मेमिन

13

आप जो हासिल करने की कोशिश कर रहे हैं, उसका एक छोटा सा उदाहरण संभवतः 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पसंद में कॉपी और पेस्ट करें ।


10

यदि आप इस बारे में रुचि रखते हैं कि एक ओपन सोर्स प्रोजेक्ट इस तरह से कैसे सामान करता है, तो आप टेराकोटा वर्ग (ओस्वा) की जांच कर सकते हैं जो यहां इस कबाड़ को संभालता है:

और आप जेवीएम संस्करणों (Vm.java और VmVersion.java) को संभालने के लिए एक समान वर्ग देख सकते हैं:


2
वह टेराकोटा वर्ग बहुत व्यापक है!
स्टीवर्ट

3
लाइसेंस से सावधान रहें !!
harschware

वोल्फगैंग फाहल के जवाब में जेम्स रोपर द्वारा पहचाने गए इसी मुद्दे से भी पीड़ित हैं - toLowerCaseएक लोकेल को निर्दिष्ट किए बिना उपयोग
kbolino

9

यह सरल और आसान प्रयास करें

System.getProperty("os.name");
System.getProperty("os.version");
System.getProperty("os.arch");

9

इस प्रोजेक्ट से लिया गया 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 {
}

8

नीचे दिए गए कोड उन मूल्यों को दर्शाते हैं जो आप सिस्टम एपीआई से प्राप्त कर सकते हैं, ये सभी चीजें आप इस एपीआई के माध्यम से प्राप्त कर सकते हैं।

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
\

7

मुझे लगता है कि Swingx से OS Utils काम करता है।


2
उपरोक्त लिंक टूटी हुई लगती है, शायद स्विंगिंगएक्स की शाखाओं को शुरू करने के कारण; 1.6 रिलीज़ यहाँ है: swingx.dev.java.net/source/browse/swingx/tags/SwingX-1-6/src/…
डेविड मोल्स

1
@ डेविड मोल्स, धन्यवाद। लिंक ठीक था जब मैंने जवाब दिया- मैंने अब इसे आपके साथ अपडेट कर दिया है।
रिचर्ड हैरिसन




4

आप बस sun.awt.OSInfo # getOSType () विधि का उपयोग कर सकते हैं


यह सबसे अच्छा जवाब होना चाहिए! मैं अभी जाँच कर रहा था कि क्या किसी ने पहले ही यहाँ पर इसका उल्लेख किया है।
मार्टिन क्राजिकोवी

इसके लिए कोई वर्कअराउंड 'प्रतिबंधित एपीआई' है? मैं इसका उपयोग करने की कोशिश करना चाहता हूं, लेकिन यह मुझे ग्रहण में चेतावनी देता है। मैं एक पुराने jre (जैसे jre1.8.0_171) का उपयोग कर सकता हूं, लेकिन नवीनतम 1.8 jres ने इसे प्रतिबंधित के रूप में चिह्नित किया है।
ब्रायन_एनेटी

4

यदि आप सुरक्षा संवेदनशील वातावरण में काम कर रहे हैं, तो कृपया इसे पढ़ें।

कृपया कभी भी 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;
}

एक और अच्छा विचार ऑपरेटिंग सिस्टम विशिष्ट निर्देशिकाओं की उपस्थिति की जांच करना है। जो कुछ भी आप ले सकते हैं, याद रखें कि जावा भाषा क्रॉस प्लेटफॉर्म होने के लिए प्रेरित है। तो, आप ऐसा करने की कोशिश क्यों नहीं करते?


3

मुझे वोल्फगैंग का जवाब पसंद आया, सिर्फ इसलिए कि मेरा मानना ​​है कि इस तरह की चीजें कॉन्स्टेबल होनी चाहिए ...

इसलिए मैंने इसे अपने लिए थोड़ा सा रीफ़्रेश किया है, और इसे साझा करने के लिए सोचा है :)

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

ऐसा लगता है कि "डार्विन" का कभी मिलान नहीं किया जा सकता क्योंकि "जीत" की जाँच करने से विंडोज पहले ही वापस आ जाएगा।
TVkanters

मेरे मूल उत्तर में सुधार देखें
वोल्फगैंग फ़ाहल

3
बधाई हो, आपने sun.awt.OSInfo # getOSType :) को फिर से लागू किया है
Kirill Gamazkov

HHHHH ... अच्छा एक ... @Kirill Gamazkov मैंने इसे वापस नहीं पाया .. तो इसे इंगित करने के लिए धन्यवाद
TacB0sS

2

यह सिस्टम ओएस प्रकार, नाम, जावा जानकारी आदि के बारे में सभी जानकारी प्रदर्शित करने के लिए कोड है।

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

1

Com.sun.jna.Platform क्लास में आप उपयोगी स्थैतिक तरीके पा सकते हैं

Platform.isWindows();
Platform.is64Bit();
Platform.isIntel();
Platform.isARM();

और भी बहुत कुछ।

यदि आप मावेन का उपयोग करते हैं तो केवल निर्भरता जोड़ें

<dependency>
 <groupId>net.java.dev.jna</groupId>
 <artifactId>jna</artifactId>
 <version>5.2.0</version>
</dependency>

अन्यथा सिर्फ jna Library jar फ़ाइल (उदा। Jna-5.2.0.jar) ढूंढें और इसे क्लासपाथ में जोड़ें।


1

बस com.sun.javafx.util.Utilsनीचे के रूप में उपयोग करें।

if ( Utils.isWindows()){
     // LOGIC HERE
}

या उपयोग करें

boolean isWindows = OSInfo.getOSType().equals(OSInfo.OSType.WINDOWS);
       if (isWindows){
         // YOUR LOGIC HERE
       }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.