How do I programmatically determine operating system in Java?

JavaOperating System

Java Problem Overview


I would like to determine the operating system of the host that my Java program is running programmatically (for example: I would like to be able to load different properties based on whether I am on a Windows or Unix platform). What is the safest way to do this with 100% reliability?

Java Solutions


Solution 1 - Java

You can use:

System.getProperty("os.name")

P.S. You may find this code useful:

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

All it does is print out all the properties provided by your Java implementations. It'll give you an idea of what you can find out about your Java environment via properties. :-)

Solution 2 - Java

As indicated in other answers, System.getProperty provides the raw data. However, the Apache Commons Lang component provides a wrapper for java.lang.System with handy properties like SystemUtils.IS_OS_WINDOWS, much like the aforementioned Swingx OS util.

Solution 3 - Java

Oct. 2008:

I would recommend to cache it in a static variable:

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
}

That way, every time you ask for the Os, you do not fetch the property more than once in the lifetime of your application.


February 2016: 7+ years later:

There is a bug with Windows 10 (which did not exist at the time of the original answer).
See "Java's “os.name” for Windows 10?"

Solution 4 - Java

some of the links in the answers above seem to be broken. I have added pointers to current source code in the code below and offer an approach for handling the check with an enum as an answer so that a switch statement can be used when evaluating the result:

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

The helper class is:

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

Solution 5 - Java

The following JavaFX classes have static methods to determine current OS (isWindows(),isLinux()...):

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

Example:

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

Solution 6 - Java

TL;DR

For accessing OS use: System.getProperty("os.name").


But WAIT!!!

Why not create a utility class, make it reusable! And probably much faster on multiple calls. Clean, clear, faster!

Create a Util class for such utility functions. Then create public enums for each operating system type.

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

Now, you can easily invoke class from any class as follows,(P.S. Since we declared os variable as static, it will consume time only once to identify the system type, then it can be used until your application halts. )

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

and That is it!

Solution 7 - Java

A small example of what you're trying to achieve would probably be a class similar to what's underneath:

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

This particular implementation is quite reliable and should be universally applicable. Just copy and paste it into your class of choice.

Solution 8 - Java

Try this,simple and easy

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

Solution 9 - Java

If you're interested in how an open source project does stuff like this, you can check out the Terracotta class (Os.java) that handles this junk here:

And you can see a similar class to handle JVM versions (Vm.java and VmVersion.java) here:

Solution 10 - Java

Below code shows the values that you can get from System API, these all things you can get through this 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"));
    }
}

Answers:-

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
\

Solution 11 - Java

I think following can give broader coverage in fewer lines

import org.apache.commons.exec.OS;

if (OS.isFamilyWindows()){
                //load some property
            }
else if (OS.isFamilyUnix()){
                //load some other property
            }

More details here: https://commons.apache.org/proper/commons-exec/apidocs/org/apache/commons/exec/OS.html

Solution 12 - Java

If you're working in a security sensitive environment, then please read this through.

Please refrain from ever trusting a property obtained via the System#getProperty(String) subroutine! Actually, almost every property including os.arch, os.name, and os.version isn't readonly as you'd might expect — instead, they're actually quite the opposite.

First of all, any code with sufficient permission of invoking the System#setProperty(String, String) subroutine can modify the returned literal at will. However, that's not necessarily the primary issue here, as it can be resolved through the use of a so called SecurityManager, as described in greater detail over here.

The actual issue is that any user is able to edit these properties when running the JAR in question (through -Dos.name=, -Dos.arch=, etc.). A possible way to avoid tampering with the application parameters is by querying the RuntimeMXBean as shown here. The following code snippet should provide some insight into how this may be achieved.

RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
List<String> arguments = runtimeMxBean.getInputArguments();

for (String argument : arguments) {
    if (argument.startsWith("-Dos.name") {
        // System.getProperty("os.name") altered
    } else if (argument.startsWith("-Dos.arch") {
        // System.getProperty("os.arch") altered
    }
}

Solution 13 - Java

I find that the OS Utils from Swingx does the job.

Solution 14 - Java

String osName = System.getProperty("os.name");
System.out.println("Operating system " + osName);

Solution 15 - Java

I liked Wolfgang's answer, just because I believe things like that should be consts...

so I've rephrased it a bit for myself, and thought to share it :)

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

Solution 16 - Java

You can just use sun.awt.OSInfo#getOSType() method

Solution 17 - Java

A bit shorter, cleaner (and eagerly computed) version of the top answers:

switch(OSType.DETECTED){
...
}

The helper enum:

public enum OSType {
    Windows, MacOS, Linux, Other;
    public static final  OSType DETECTED;
    static{
        String OS = System.getProperty("os.name", "generic").toLowerCase(Locale.ENGLISH);
        if ((OS.contains("mac")) || (OS.contains("darwin"))) {
            DETECTED = OSType.MacOS;
        } else if (OS.contains("win")) {
            DETECTED = OSType.Windows;
        } else if (OS.contains("nux")) {
            DETECTED = OSType.Linux;
        } else {
            DETECTED = OSType.Other;
        }
    }
}

Solution 18 - Java

This code for displaying all information about the system os type,name , java information and so on.

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

Solution 19 - Java

In com.sun.jna.Platform class you can find useful static methods like

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

and much more.

If you use Maven just add dependency

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

Otherwise just find jna library jar file (ex. jna-5.2.0.jar) and add it to classpath.

Solution 20 - Java

Since google points "kotlin os name" to this page, here's the Kotlin version of @Memin 's answer:

private var _osType: OsTypes? = null
val osType: OsTypes
    get() {
        if (_osType == null) {
            _osType = with(System.getProperty("os.name").lowercase(Locale.getDefault())) {
                if (contains("win"))
                    OsTypes.WINDOWS
                else if (listOf("nix", "nux", "aix").any { contains(it) })
                    OsTypes.LINUX
                else if (contains("mac"))
                    OsTypes.MAC
                else if (contains("sunos"))
                    OsTypes.SOLARIS
                else
                    OsTypes.OTHER
            }
        }
        return _osType!!
    }

enum class OsTypes {
    WINDOWS, LINUX, MAC, SOLARIS, OTHER
}

Solution 21 - Java

Just use com.sun.javafx.util.Utils as below.

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

OR USE

boolean isWindows = OSInfo.getOSType().equals(OSInfo.OSType.WINDOWS);
       if (isWindows){
         // YOUR LOGIC HERE
       }

Solution 22 - Java

For getting OS name, simply use:

Platform.getOS()

Lets say you want to see if platform is linux:

if (Platform.getOS().equals(Platform.OS_LINUX)) {
}

Similarly Platform class have defined constants for others operating system names. Platform class is part of org.eclipse.core.runtime package.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionkarlgrzView Question on Stackoverflow
Solution 1 - JavaChris Jester-YoungView Answer on Stackoverflow
Solution 2 - JavaLeif CarlsenView Answer on Stackoverflow
Solution 3 - JavaVonCView Answer on Stackoverflow
Solution 4 - JavaWolfgang FahlView Answer on Stackoverflow
Solution 5 - JavaIhor RybakView Answer on Stackoverflow
Solution 6 - JavaMeminView Answer on Stackoverflow
Solution 7 - JavaNikesh JauhariView Answer on Stackoverflow
Solution 8 - JavaKamiduView Answer on Stackoverflow
Solution 9 - JavaAlex MillerView Answer on Stackoverflow
Solution 10 - JavaPAAView Answer on Stackoverflow
Solution 11 - JavaNafeez QuraishiView Answer on Stackoverflow
Solution 12 - JavaTheikonView Answer on Stackoverflow
Solution 13 - JavaRichard HarrisonView Answer on Stackoverflow
Solution 14 - JavaVishal ChaudhariView Answer on Stackoverflow
Solution 15 - JavaTacB0sSView Answer on Stackoverflow
Solution 16 - JavaKirill GamazkovView Answer on Stackoverflow
Solution 17 - JavaHristo StoyanovView Answer on Stackoverflow
Solution 18 - JavaShinnedHawksView Answer on Stackoverflow
Solution 19 - JavaVladimir VaschenkoView Answer on Stackoverflow
Solution 20 - JavanimaView Answer on Stackoverflow
Solution 21 - JavaitroView Answer on Stackoverflow
Solution 22 - JavaShahzadIftikharView Answer on Stackoverflow