Files
hutool/hutool-system/src/main/java/cn/hutool/system/OsInfo.java
2021-05-05 18:52:01 +08:00

447 lines
12 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package cn.hutool.system;
import java.io.Serializable;
/**
* 代表当前OS的信息。
*/
public class OsInfo implements Serializable{
private static final long serialVersionUID = 1L;
private final String OS_VERSION = SystemUtil.get("os.version", false);
private final String OS_ARCH = SystemUtil.get("os.arch", false);
private final String OS_NAME = SystemUtil.get("os.name", false);
private final boolean IS_OS_AIX = getOSMatches("AIX");
private final boolean IS_OS_HP_UX = getOSMatches("HP-UX");
private final boolean IS_OS_IRIX = getOSMatches("Irix");
private final boolean IS_OS_LINUX = getOSMatches("Linux") || getOSMatches("LINUX");
private final boolean IS_OS_MAC = getOSMatches("Mac");
private final boolean IS_OS_MAC_OSX = getOSMatches("Mac OS X");
private final boolean IS_OS_OS2 = getOSMatches("OS/2");
private final boolean IS_OS_SOLARIS = getOSMatches("Solaris");
private final boolean IS_OS_SUN_OS = getOSMatches("SunOS");
private final boolean IS_OS_WINDOWS = getOSMatches("Windows");
private final boolean IS_OS_WINDOWS_2000 = getOSMatches("Windows", "5.0");
private final boolean IS_OS_WINDOWS_95 = getOSMatches("Windows 9", "4.0");
private final boolean IS_OS_WINDOWS_98 = getOSMatches("Windows 9", "4.1");
private final boolean IS_OS_WINDOWS_ME = getOSMatches("Windows", "4.9");
private final boolean IS_OS_WINDOWS_NT = getOSMatches("Windows NT");
private final boolean IS_OS_WINDOWS_XP = getOSMatches("Windows", "5.1");
private final boolean IS_OS_WINDOWS_7 = getOSMatches("Windows", "6.1");
private final boolean IS_OS_WINDOWS_8 = getOSMatches("Windows", "6.2");
private final boolean IS_OS_WINDOWS_8_1 = getOSMatches("Windows", "6.3");
private final boolean IS_OS_WINDOWS_10 = getOSMatches("Windows", "10.0");
// 由于改变file.encoding属性并不会改变系统字符编码为了保持一致通过LocaleUtil取系统默认编码。
private final String FILE_SEPARATOR = SystemUtil.get("file.separator", false);
private final String LINE_SEPARATOR = SystemUtil.get("line.separator", false);
private final String PATH_SEPARATOR = SystemUtil.get("path.separator", false);
/**
* 取得当前OS的架构取自系统属性<code>os.arch</code>)。
*
* <p>
* 例如:<code>"x86"</code>
* </p>
*
* @return 属性值如果不能取得因为Java安全限制或值不存在则返回<code>null</code>。
*
* @since Java 1.1
*/
public final String getArch() {
return OS_ARCH;
}
/**
* 取得当前OS的名称取自系统属性<code>os.name</code>)。
*
* <p>
* 例如:<code>"Windows XP"</code>
* </p>
*
* @return 属性值如果不能取得因为Java安全限制或值不存在则返回<code>null</code>。
*
* @since Java 1.1
*/
public final String getName() {
return OS_NAME;
}
/**
* 取得当前OS的版本取自系统属性<code>os.version</code>)。
*
* <p>
* 例如:<code>"5.1"</code>
* </p>
*
* @return 属性值如果不能取得因为Java安全限制或值不存在则返回<code>null</code>。
*
* @since Java 1.1
*/
public final String getVersion() {
return OS_VERSION;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为AIX则返回<code>true</code>
*/
public final boolean isAix() {
return IS_OS_AIX;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为HP-UX则返回<code>true</code>
*/
public final boolean isHpUx() {
return IS_OS_HP_UX;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为IRIX则返回<code>true</code>
*/
public final boolean isIrix() {
return IS_OS_IRIX;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为Linux则返回<code>true</code>
*/
public final boolean isLinux() {
return IS_OS_LINUX;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为Mac则返回<code>true</code>
*/
public final boolean isMac() {
return IS_OS_MAC;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为MacOS X则返回<code>true</code>
*/
public final boolean isMacOsX() {
return IS_OS_MAC_OSX;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为OS2则返回<code>true</code>
*/
public final boolean isOs2() {
return IS_OS_OS2;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为Solaris则返回<code>true</code>
*/
public final boolean isSolaris() {
return IS_OS_SOLARIS;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为Sun OS则返回<code>true</code>
*/
public final boolean isSunOS() {
return IS_OS_SUN_OS;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为Windows则返回<code>true</code>
*/
public final boolean isWindows() {
return IS_OS_WINDOWS;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为Windows 2000则返回<code>true</code>
*/
public final boolean isWindows2000() {
return IS_OS_WINDOWS_2000;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为Windows 95则返回<code>true</code>
*/
public final boolean isWindows95() {
return IS_OS_WINDOWS_95;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为Windows 98则返回<code>true</code>
*/
public final boolean isWindows98() {
return IS_OS_WINDOWS_98;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为Windows ME则返回<code>true</code>
*/
public final boolean isWindowsME() {
return IS_OS_WINDOWS_ME;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为Windows NT则返回<code>true</code>
*/
public final boolean isWindowsNT() {
return IS_OS_WINDOWS_NT;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为Windows XP则返回<code>true</code>
*/
public final boolean isWindowsXP() {
return IS_OS_WINDOWS_XP;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为Windows 7则返回<code>true</code>
*/
public final boolean isWindows7() {
return IS_OS_WINDOWS_7;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为Windows 8则返回<code>true</code>
*/
public final boolean isWindows8() {
return IS_OS_WINDOWS_8;
}
@Deprecated
public final boolean isWindoows8() {
return IS_OS_WINDOWS_8;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为Windows 8.1,则返回<code>true</code>
*/
public final boolean isWindows8_1() {
return IS_OS_WINDOWS_8_1;
}
/**
* 判断当前OS的类型。
*
* <p>
* 如果不能取得系统属性<code>os.name</code>因为Java安全限制则总是返回<code>false</code>
* </p>
*
* @return 如果当前OS类型为Windows 10则返回<code>true</code>
*/
public final boolean isWindows10() {
return IS_OS_WINDOWS_10;
}
/**
* 匹配OS名称。
*
* @param osNamePrefix OS名称前缀
*
* @return 如果匹配,则返回<code>true</code>
*/
private boolean getOSMatches(String osNamePrefix) {
if (OS_NAME == null) {
return false;
}
return OS_NAME.startsWith(osNamePrefix);
}
/**
* 匹配OS名称。
*
* @param osNamePrefix OS名称前缀
* @param osVersionPrefix OS版本前缀
*
* @return 如果匹配,则返回<code>true</code>
*/
private boolean getOSMatches(String osNamePrefix, String osVersionPrefix) {
if ((OS_NAME == null) || (OS_VERSION == null)) {
return false;
}
return OS_NAME.startsWith(osNamePrefix) && OS_VERSION.startsWith(osVersionPrefix);
}
/**
* 取得OS的文件路径的分隔符取自系统属性<code>file.separator</code>)。
*
* <p>
* 例如Unix为<code>"/"</code>Windows为<code>"\\"</code>。
* </p>
*
* @return 属性值如果不能取得因为Java安全限制或值不存在则返回<code>null</code>。
*
* @since Java 1.1
*/
public final String getFileSeparator() {
return FILE_SEPARATOR;
}
/**
* 取得OS的文本文件换行符取自系统属性<code>line.separator</code>)。
*
* <p>
* 例如Unix为<code>"\n"</code>Windows为<code>"\r\n"</code>。
* </p>
*
* @return 属性值如果不能取得因为Java安全限制或值不存在则返回<code>null</code>。
*
* @since Java 1.1
*/
public final String getLineSeparator() {
return LINE_SEPARATOR;
}
/**
* 取得OS的搜索路径分隔符取自系统属性<code>path.separator</code>)。
*
* <p>
* 例如Unix为<code>":"</code>Windows为<code>";"</code>。
* </p>
*
* @return 属性值如果不能取得因为Java安全限制或值不存在则返回<code>null</code>。
*
* @since Java 1.1
*/
public final String getPathSeparator() {
return PATH_SEPARATOR;
}
/**
* 将OS的信息转换成字符串。
*
* @return OS的字符串表示
*/
@Override
public final String toString() {
StringBuilder builder = new StringBuilder();
SystemUtil.append(builder, "OS Arch: ", getArch());
SystemUtil.append(builder, "OS Name: ", getName());
SystemUtil.append(builder, "OS Version: ", getVersion());
SystemUtil.append(builder, "File Separator: ", getFileSeparator());
SystemUtil.append(builder, "Line Separator: ", getLineSeparator());
SystemUtil.append(builder, "Path Separator: ", getPathSeparator());
return builder.toString();
}
}