Câu trả lời:
Bạn có thể dùng:
System.getProperty("os.name")
PS Bạn có thể thấy mã này hữu ích:
class ShowProperties {
public static void main(String[] args) {
System.getProperties().list(System.out);
}
}
Tất cả những gì nó làm là in ra tất cả các thuộc tính được cung cấp bởi các triển khai Java của bạn. Nó sẽ cho bạn ý tưởng về những gì bạn có thể tìm hiểu về môi trường Java của mình thông qua các thuộc tính. :-)
Như đã chỉ ra trong các câu trả lời khác, System.getProperty cung cấp dữ liệu thô. Tuy nhiên, thành phần Apache Commons Lang cung cấp trình bao bọc cho java.lang.System với các thuộc tính tiện dụng như SystemUtils.IS_OS_WINDOWS
, giống như sử dụng hệ điều hành Swingx đã nói ở trên.
Tháng 10 năm 2008:
Tôi khuyên bạn nên lưu trữ nó trong một biến tĩnh:
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
}
Bằng cách đó, mỗi khi bạn yêu cầu Os, bạn không tìm nạp tài sản nhiều hơn một lần trong suốt vòng đời của ứng dụng của mình.
Tháng 2 năm 2016: 7+ năm sau:
Có một lỗi với Windows 10 (không tồn tại tại thời điểm trả lời ban đầu).
Xem " Java's os osname name cho Windows 10? "
isWindows
, isUnix
cách, vv Đó giúp bạn tiết kiệm trên chuỗi thời gian so sánh cũng có.
một số liên kết trong các câu trả lời ở trên dường như bị phá vỡ. Tôi đã thêm con trỏ vào mã nguồn hiện tại trong mã bên dưới và đưa ra cách tiếp cận để xử lý kiểm tra với enum như một câu trả lời để có thể sử dụng câu lệnh chuyển đổi khi đánh giá kết quả:
OsCheck.OSType ostype=OsCheck.getOperatingSystemType();
switch (ostype) {
case Windows: break;
case MacOS: break;
case Linux: break;
case Other: break;
}
Lớp người trợ giúp là:
/**
* 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;
}
}
Các lớp JavaFX sau đây có các phương thức tĩnh để xác định HĐH hiện tại (isWindows (), isLinux () ...):
Thí dụ:
if (PlatformUtil.isWindows()){
...
}
TL; DR
Để truy cập hệ điều hành, sử dụng : System.getProperty("os.name")
.
Nhưng tại sao không tạo ra một lớp tiện ích, làm cho nó có thể tái sử dụng! Và có lẽ nhanh hơn nhiều trên nhiều cuộc gọi. Sạch sẽ, rõ ràng, nhanh hơn!
Tạo một lớp Util cho các chức năng tiện ích như vậy. Sau đó tạo enum công khai cho từng loại hệ điều hành.
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;
}
}
Bây giờ, bạn có thể dễ dàng gọi lớp từ bất kỳ lớp nào như sau, (PS Vì chúng tôi đã khai báo biến os là tĩnh, nên sẽ chỉ mất một lần thời gian để xác định loại hệ thống, sau đó nó có thể được sử dụng cho đến khi ứng dụng của bạn tạm dừng.)
switch (Util.getOS()) {
case WINDOWS:
//do windows stuff
break;
case LINUX:
Và đó là nó!
Một ví dụ nhỏ về những gì bạn đang cố gắng đạt được có thể class
tương tự như những gì bên dưới:
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");
}
}
Việc thực hiện cụ thể này là khá đáng tin cậy và nên được áp dụng phổ biến. Chỉ cần sao chép và dán nó vào class
sự lựa chọn của bạn .
Nếu bạn quan tâm đến cách một dự án nguồn mở thực hiện những thứ như thế này, bạn có thể xem lớp Terracotta (Os.java) xử lý rác này tại đây:
Và bạn có thể thấy một lớp tương tự để xử lý các phiên bản JVM (Vm.java và VmVersion.java) tại đây:
toLowerCase
mà không chỉ định một địa điểm
Lấy từ dự án này https://github.com/RishiGupta12/serial-cransication-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 {
}
Mã bên dưới hiển thị các giá trị mà bạn có thể nhận được từ API hệ thống, tất cả những điều bạn có thể nhận được thông qua API này.
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"));
}
}
Đáp án: -
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
\
Tôi thấy rằng hệ điều hành Utils từ Swingx thực hiện công việc.
Tôi nghĩ rằng sau đây có thể cung cấp bảo hiểm rộng hơn trong ít dòng
import org.apache.commons.exec.OS;
if (OS.isFamilyWindows()){
//load some property
}
else if (OS.isFamilyUnix()){
//load some other property
}
Thêm chi tiết tại đây: https://commons.apache.org/proper/commons-exec/apidocs/org/apache/commons/exec/OS.html
String osName = System.getProperty("os.name");
System.out.println("Operating system " + osName);
Bạn chỉ có thể sử dụng phương thức sun.awt.OSInfo # getOSType ()
Nếu bạn đang làm việc trong một môi trường nhạy cảm về bảo mật, thì vui lòng đọc qua.
Xin vui lòng không bao giờ tin tưởng một tài sản có được thông qua System#getProperty(String)
chương trình con! Trên thực tế, hầu hết mọi tài sản bao gồm os.arch
, os.name
và os.version
không chỉ đọc như bạn mong đợi - thay vào đó, chúng thực sự hoàn toàn ngược lại.
Trước hết, bất kỳ mã nào có đủ quyền cho phép gọi System#setProperty(String, String)
chương trình con đều có thể sửa đổi nghĩa đen được trả về theo ý muốn. Tuy nhiên, đó không nhất thiết là vấn đề chính ở đây, vì nó có thể được giải quyết thông qua việc sử dụng cái gọi là SecurityManager
, như được mô tả chi tiết hơn ở đây .
Vấn đề thực tế là bất kỳ người dùng nào cũng có thể chỉnh sửa các thuộc tính này khi chạy JAR
câu hỏi. Điều này có nghĩa là không có cách nào để xác định xem các tính chất này có thực sự chính xác hay không. Vì điều này, đây là một vài kiểm tra bổ sung để thử và tránh giả mạo:
// 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;
}
Một ý tưởng tốt khác là kiểm tra sự hiện diện của các thư mục cụ thể của hệ điều hành. Bất cứ cách tiếp cận nào bạn có thể thực hiện, hãy nhớ rằng ngôn ngữ Java được thụt lề là nền tảng chéo. Vậy tại sao bạn không thử làm điều tương tự?
Tôi thích câu trả lời của Wolfgang, chỉ vì tôi tin rằng những thứ như thế nên là ...
Vì vậy, tôi đã chia sẻ lại một chút cho bản thân mình và nghĩ sẽ chia sẻ nó :)
/**
* 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;
}
}
Mã này để hiển thị tất cả thông tin về loại hệ thống os, tên, thông tin java, v.v.
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));
}
}
Trong lớp com.sun.jna.Pl platform, bạn có thể tìm thấy các phương thức tĩnh hữu ích như
Platform.isWindows();
Platform.is64Bit();
Platform.isIntel();
Platform.isARM();
và nhiều hơn nữa.
Nếu bạn sử dụng Maven, chỉ cần thêm phụ thuộc
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.2.0</version>
</dependency>
Nếu không, chỉ cần tìm tệp jar thư viện jna (ví dụ: jna-5.2.0.jar) và thêm nó vào classpath.
Windows 10
vàos.name
cung cấp cho tôiWindows 8.1
. Tại sao vậy? Cái này đến từ đâu vậy?