PageRenderTime 54ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/common/util/src/main/java/com/alibaba/citrus/util/SystemUtil.java

https://bitbucket.org/michael_zyh/citrus
Java | 1401 lines | 506 code | 147 blank | 748 comment | 20 complexity | 4e1abf72ba686fce9cf43f431754bab2 MD5 | raw file
  1. /*
  2. * Copyright (c) 2002-2012 Alibaba Group Holding Limited.
  3. * All rights reserved.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. package com.alibaba.citrus.util;
  18. import static com.alibaba.citrus.util.CollectionUtil.*;
  19. import static com.alibaba.citrus.util.ObjectUtil.*;
  20. import java.io.PrintWriter;
  21. import java.net.InetAddress;
  22. import java.net.UnknownHostException;
  23. import java.util.Collections;
  24. import java.util.List;
  25. import java.util.Set;
  26. import com.alibaba.citrus.util.i18n.LocaleUtil;
  27. /**
  28. * 取得有关系统信息的工具类。
  29. * <p>
  30. * 如果因为Java安全的原因而不能取得<code>System.getProperty</code>,则相应的字段将被设置成
  31. * <code>null</code>, 并且这个消息将被输出到<code>System.err</code>中。
  32. * </p>
  33. *
  34. * @author Michael Zhou
  35. */
  36. public class SystemUtil {
  37. private static final JvmSpecInfo JVM_SPEC_INFO = new JvmSpecInfo();
  38. private static final JvmInfo JVM_INFO = new JvmInfo();
  39. private static final JavaSpecInfo JAVA_SPEC_INFO = new JavaSpecInfo();
  40. private static final JavaInfo JAVA_INFO = new JavaInfo();
  41. private static final OsInfo OS_INFO = new OsInfo();
  42. private static final UserInfo USER_INFO = new UserInfo();
  43. private static final HostInfo HOST_INFO = new HostInfo();
  44. private static final JavaRuntimeInfo JAVA_RUNTIME_INFO = new JavaRuntimeInfo();
  45. /**
  46. * 取得Java Virtual Machine Specification的信息。
  47. *
  48. * @return <code>JvmSpecInfo</code>对象
  49. */
  50. public static final JvmSpecInfo getJvmSpecInfo() {
  51. return JVM_SPEC_INFO;
  52. }
  53. /**
  54. * 取得Java Virtual Machine Implementation的信息。
  55. *
  56. * @return <code>JvmInfo</code>对象
  57. */
  58. public static final JvmInfo getJvmInfo() {
  59. return JVM_INFO;
  60. }
  61. /**
  62. * 取得Java Specification的信息。
  63. *
  64. * @return <code>JavaSpecInfo</code>对象
  65. */
  66. public static final JavaSpecInfo getJavaSpecInfo() {
  67. return JAVA_SPEC_INFO;
  68. }
  69. /**
  70. * 取得Java Implementation的信息。
  71. *
  72. * @return <code>JavaInfo</code>对象
  73. */
  74. public static final JavaInfo getJavaInfo() {
  75. return JAVA_INFO;
  76. }
  77. /**
  78. * 取得当前运行的JRE的信息。
  79. *
  80. * @return <code>JreInfo</code>对象
  81. */
  82. public static final JavaRuntimeInfo getJavaRuntimeInfo() {
  83. return JAVA_RUNTIME_INFO;
  84. }
  85. /**
  86. * 取得OS的信息。
  87. *
  88. * @return <code>OsInfo</code>对象
  89. */
  90. public static final OsInfo getOsInfo() {
  91. return OS_INFO;
  92. }
  93. /**
  94. * 取得User的信息。
  95. *
  96. * @return <code>UserInfo</code>对象
  97. */
  98. public static final UserInfo getUserInfo() {
  99. return USER_INFO;
  100. }
  101. /**
  102. * 取得Host的信息。
  103. *
  104. * @return <code>HostInfo</code>对象
  105. */
  106. public static final HostInfo getHostInfo() {
  107. return HOST_INFO;
  108. }
  109. /** 代表Java Virutal Machine Specification的信息。 */
  110. public static final class JvmSpecInfo {
  111. private final String JAVA_VM_SPECIFICATION_NAME = getSystemProperty("java.vm.specification.name", false);
  112. private final String JAVA_VM_SPECIFICATION_VERSION = getSystemProperty("java.vm.specification.version", false);
  113. private final String JAVA_VM_SPECIFICATION_VENDOR = getSystemProperty("java.vm.specification.vendor", false);
  114. /** 防止从外界创建此对象。 */
  115. private JvmSpecInfo() {
  116. }
  117. /**
  118. * 取得当前JVM spec.的名称(取自系统属性:<code>java.vm.specification.name</code>)。
  119. * <p>
  120. * 例如Sun JDK 1.4.2:<code>"Java Virtual Machine Specification"</code>
  121. * </p>
  122. *
  123. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  124. * @since Java 1.2
  125. */
  126. public final String getName() {
  127. return JAVA_VM_SPECIFICATION_NAME;
  128. }
  129. /**
  130. * 取得当前JVM spec.的版本(取自系统属性:<code>java.vm.specification.version</code>)。
  131. * <p>
  132. * 例如Sun JDK 1.4.2:<code>"1.0"</code>
  133. * </p>
  134. *
  135. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  136. * @since Java 1.2
  137. */
  138. public final String getVersion() {
  139. return JAVA_VM_SPECIFICATION_VERSION;
  140. }
  141. /**
  142. * 取得当前JVM spec.的厂商(取自系统属性:<code>java.vm.specification.vendor</code>)。
  143. * <p>
  144. * 例如Sun JDK 1.4.2:<code>"Sun Microsystems Inc."</code>
  145. * </p>
  146. *
  147. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  148. * @since Java 1.2
  149. */
  150. public final String getVendor() {
  151. return JAVA_VM_SPECIFICATION_VENDOR;
  152. }
  153. /**
  154. * 将Java Virutal Machine Specification的信息转换成字符串。
  155. *
  156. * @return JVM spec.的字符串表示
  157. */
  158. @Override
  159. public final String toString() {
  160. StringBuilder buffer = new StringBuilder();
  161. append(buffer, "JavaVM Spec. Name: ", getName());
  162. append(buffer, "JavaVM Spec. Version: ", getVersion());
  163. append(buffer, "JavaVM Spec. Vendor: ", getVendor());
  164. return buffer.toString();
  165. }
  166. }
  167. /** 代表Java Virtual Machine Implementation的信息。 */
  168. public static final class JvmInfo {
  169. private final String JAVA_VM_NAME = getSystemProperty("java.vm.name", false);
  170. private final String JAVA_VM_VERSION = getSystemProperty("java.vm.version", false);
  171. private final String JAVA_VM_VENDOR = getSystemProperty("java.vm.vendor", false);
  172. private final String JAVA_VM_INFO = getSystemProperty("java.vm.info", false);
  173. /** 防止从外界创建此对象。 */
  174. private JvmInfo() {
  175. }
  176. /**
  177. * 取得当前JVM impl.的名称(取自系统属性:<code>java.vm.name</code>)。
  178. * <p>
  179. * 例如Sun JDK 1.4.2:<code>"Java HotSpot(TM) Client VM"</code>
  180. * </p>
  181. *
  182. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  183. * @since Java 1.2
  184. */
  185. public final String getName() {
  186. return JAVA_VM_NAME;
  187. }
  188. /**
  189. * 取得当前JVM impl.的版本(取自系统属性:<code>java.vm.version</code>)。
  190. * <p>
  191. * 例如Sun JDK 1.4.2:<code>"1.4.2-b28"</code>
  192. * </p>
  193. *
  194. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  195. * @since Java 1.2
  196. */
  197. public final String getVersion() {
  198. return JAVA_VM_VERSION;
  199. }
  200. /**
  201. * 取得当前JVM impl.的厂商(取自系统属性:<code>java.vm.vendor</code>)。
  202. * <p>
  203. * 例如Sun JDK 1.4.2:<code>"Sun Microsystems Inc."</code>
  204. * </p>
  205. *
  206. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  207. * @since Java 1.2
  208. */
  209. public final String getVendor() {
  210. return JAVA_VM_VENDOR;
  211. }
  212. /**
  213. * 取得当前JVM impl.的信息(取自系统属性:<code>java.vm.info</code>)。
  214. * <p>
  215. * 例如Sun JDK 1.4.2:<code>"mixed mode"</code>
  216. * </p>
  217. *
  218. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  219. * @since Java 1.2
  220. */
  221. public final String getInfo() {
  222. return JAVA_VM_INFO;
  223. }
  224. /**
  225. * 将Java Virutal Machine Implementation的信息转换成字符串。
  226. *
  227. * @return JVM impl.的字符串表示
  228. */
  229. @Override
  230. public final String toString() {
  231. StringBuilder buffer = new StringBuilder();
  232. append(buffer, "JavaVM Name: ", getName());
  233. append(buffer, "JavaVM Version: ", getVersion());
  234. append(buffer, "JavaVM Vendor: ", getVendor());
  235. append(buffer, "JavaVM Info: ", getInfo());
  236. return buffer.toString();
  237. }
  238. }
  239. /** 代表Java Specification的信息。 */
  240. public static final class JavaSpecInfo {
  241. private final String JAVA_SPECIFICATION_NAME = getSystemProperty("java.specification.name", false);
  242. private final String JAVA_SPECIFICATION_VERSION = getSystemProperty("java.specification.version", false);
  243. private final String JAVA_SPECIFICATION_VENDOR = getSystemProperty("java.specification.vendor", false);
  244. /** 防止从外界创建此对象。 */
  245. private JavaSpecInfo() {
  246. }
  247. /**
  248. * 取得当前Java Spec.的名称(取自系统属性:<code>java.specification.name</code>)。
  249. * <p>
  250. * 例如Sun JDK 1.4.2:<code>"Java Platform API Specification"</code>
  251. * </p>
  252. *
  253. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  254. * @since Java 1.2
  255. */
  256. public final String getName() {
  257. return JAVA_SPECIFICATION_NAME;
  258. }
  259. /**
  260. * 取得当前Java Spec.的版本(取自系统属性:<code>java.specification.version</code>)。
  261. * <p>
  262. * 例如Sun JDK 1.4.2:<code>"1.4"</code>
  263. * </p>
  264. *
  265. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  266. * @since Java 1.3
  267. */
  268. public final String getVersion() {
  269. return JAVA_SPECIFICATION_VERSION;
  270. }
  271. /**
  272. * 取得当前Java Spec.的厂商(取自系统属性:<code>java.specification.vendor</code>)。
  273. * <p>
  274. * 例如Sun JDK 1.4.2:<code>"Sun Microsystems Inc."</code>
  275. * </p>
  276. *
  277. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  278. * @since Java 1.2
  279. */
  280. public final String getVendor() {
  281. return JAVA_SPECIFICATION_VENDOR;
  282. }
  283. /**
  284. * 将Java Specification的信息转换成字符串。
  285. *
  286. * @return JVM spec.的字符串表示
  287. */
  288. @Override
  289. public final String toString() {
  290. StringBuilder buffer = new StringBuilder();
  291. append(buffer, "Java Spec. Name: ", getName());
  292. append(buffer, "Java Spec. Version: ", getVersion());
  293. append(buffer, "Java Spec. Vendor: ", getVendor());
  294. return buffer.toString();
  295. }
  296. }
  297. /** 代表Java Implementation的信息。 */
  298. public static final class JavaInfo {
  299. private final String JAVA_VERSION = getSystemProperty("java.version", false);
  300. private final float JAVA_VERSION_FLOAT = getJavaVersionAsFloat();
  301. private final int JAVA_VERSION_INT = getJavaVersionAsInt();
  302. private final String JAVA_VENDOR = getSystemProperty("java.vendor", false);
  303. private final String JAVA_VENDOR_URL = getSystemProperty("java.vendor.url", false);
  304. private final boolean IS_JAVA_1_1 = getJavaVersionMatches("1.1");
  305. private final boolean IS_JAVA_1_2 = getJavaVersionMatches("1.2");
  306. private final boolean IS_JAVA_1_3 = getJavaVersionMatches("1.3");
  307. private final boolean IS_JAVA_1_4 = getJavaVersionMatches("1.4");
  308. private final boolean IS_JAVA_1_5 = getJavaVersionMatches("1.5");
  309. /** 防止从外界创建此对象。 */
  310. private JavaInfo() {
  311. }
  312. /**
  313. * 取得当前Java impl.的版本(取自系统属性:<code>java.version</code>)。
  314. * <p>
  315. * 例如Sun JDK 1.4.2:<code>"1.4.2"</code>
  316. * </p>
  317. *
  318. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  319. * @since Java 1.1
  320. */
  321. public final String getVersion() {
  322. return JAVA_VERSION;
  323. }
  324. /**
  325. * 取得当前Java impl.的版本(取自系统属性:<code>java.version</code>)。
  326. * <p>
  327. * 例如:
  328. * <ul>
  329. * <li>JDK 1.2:<code>1.2f</code>。</li>
  330. * <li>JDK 1.3.1:<code>1.31f</code></li>
  331. * </ul>
  332. * </p>
  333. *
  334. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>0</code>。
  335. * @since Java 1.1
  336. */
  337. public final float getVersionFloat() {
  338. return JAVA_VERSION_FLOAT;
  339. }
  340. /**
  341. * 取得当前Java impl.的版本(取自系统属性:<code>java.version</code>)。
  342. * <p>
  343. * 例如:
  344. * <ul>
  345. * <li>JDK 1.2:<code>120</code>。</li>
  346. * <li>JDK 1.3.1:<code>131</code></li>
  347. * </ul>
  348. * </p>
  349. *
  350. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>0</code>。
  351. * @since Java 1.1
  352. */
  353. public final int getVersionInt() {
  354. return JAVA_VERSION_INT;
  355. }
  356. /**
  357. * 取得当前Java impl.的版本的<code>float</code>值。
  358. *
  359. * @return Java版本的<code>float</code>值或<code>0</code>
  360. */
  361. private final float getJavaVersionAsFloat() {
  362. if (JAVA_VERSION == null) {
  363. return 0f;
  364. }
  365. String str = JAVA_VERSION.substring(0, 3);
  366. if (JAVA_VERSION.length() >= 5) {
  367. str = str + JAVA_VERSION.substring(4, 5);
  368. }
  369. return Float.parseFloat(str);
  370. }
  371. /**
  372. * 取得当前Java impl.的版本的<code>int</code>值。
  373. *
  374. * @return Java版本的<code>int</code>值或<code>0</code>
  375. */
  376. private final int getJavaVersionAsInt() {
  377. if (JAVA_VERSION == null) {
  378. return 0;
  379. }
  380. String str = JAVA_VERSION.substring(0, 1);
  381. str = str + JAVA_VERSION.substring(2, 3);
  382. if (JAVA_VERSION.length() >= 5) {
  383. str = str + JAVA_VERSION.substring(4, 5);
  384. } else {
  385. str = str + "0";
  386. }
  387. return Integer.parseInt(str);
  388. }
  389. /**
  390. * 取得当前Java impl.的厂商(取自系统属性:<code>java.vendor</code>)。
  391. * <p>
  392. * 例如Sun JDK 1.4.2:<code>"Sun Microsystems Inc."</code>
  393. * </p>
  394. *
  395. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  396. * @since Java 1.1
  397. */
  398. public final String getVendor() {
  399. return JAVA_VENDOR;
  400. }
  401. /**
  402. * 取得当前Java impl.的厂商网站的URL(取自系统属性:<code>java.vendor.url</code>)。
  403. * <p>
  404. * 例如Sun JDK 1.4.2:<code>"http://java.sun.com/"</code>
  405. * </p>
  406. *
  407. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  408. * @since Java 1.1
  409. */
  410. public final String getVendorURL() {
  411. return JAVA_VENDOR_URL;
  412. }
  413. /**
  414. * 判断当前Java的版本。
  415. * <p>
  416. * 如果不能取得系统属性<code>java.version</code>(因为Java安全限制),则总是返回
  417. * <code>false</code>
  418. * </p>
  419. *
  420. * @return 如果当前Java版本为1.1,则返回<code>true</code>
  421. */
  422. public final boolean isJava11() {
  423. return IS_JAVA_1_1;
  424. }
  425. /**
  426. * 判断当前Java的版本。
  427. * <p>
  428. * 如果不能取得系统属性<code>java.version</code>(因为Java安全限制),则总是返回
  429. * <code>false</code>
  430. * </p>
  431. *
  432. * @return 如果当前Java版本为1.2,则返回<code>true</code>
  433. */
  434. public final boolean isJava12() {
  435. return IS_JAVA_1_2;
  436. }
  437. /**
  438. * 判断当前Java的版本。
  439. * <p>
  440. * 如果不能取得系统属性<code>java.version</code>(因为Java安全限制),则总是返回
  441. * <code>false</code>
  442. * </p>
  443. *
  444. * @return 如果当前Java版本为1.3,则返回<code>true</code>
  445. */
  446. public final boolean isJava13() {
  447. return IS_JAVA_1_3;
  448. }
  449. /**
  450. * 判断当前Java的版本。
  451. * <p>
  452. * 如果不能取得系统属性<code>java.version</code>(因为Java安全限制),则总是返回
  453. * <code>false</code>
  454. * </p>
  455. *
  456. * @return 如果当前Java版本为1.4,则返回<code>true</code>
  457. */
  458. public final boolean isJava14() {
  459. return IS_JAVA_1_4;
  460. }
  461. /**
  462. * 判断当前Java的版本。
  463. * <p>
  464. * 如果不能取得系统属性<code>java.version</code>(因为Java安全限制),则总是返回
  465. * <code>false</code>
  466. * </p>
  467. *
  468. * @return 如果当前Java版本为1.5,则返回<code>true</code>
  469. */
  470. public final boolean isJava15() {
  471. return IS_JAVA_1_5;
  472. }
  473. /**
  474. * 匹配当前Java的版本。
  475. *
  476. * @param versionPrefix Java版本前缀
  477. * @return 如果版本匹配,则返回<code>true</code>
  478. */
  479. private final boolean getJavaVersionMatches(String versionPrefix) {
  480. if (JAVA_VERSION == null) {
  481. return false;
  482. }
  483. return JAVA_VERSION.startsWith(versionPrefix);
  484. }
  485. /**
  486. * 判定当前Java的版本是否大于等于指定的版本号。
  487. * <p>
  488. * 例如:
  489. * </p>
  490. * <ul>
  491. * <li>测试JDK 1.2:<code>isJavaVersionAtLeast(1.2f)</code></li>
  492. * <li>测试JDK 1.2.1:<code>isJavaVersionAtLeast(1.31f)</code></li>
  493. * </ul>
  494. *
  495. * @param requiredVersion 需要的版本
  496. * @return 如果当前Java版本大于或等于指定的版本,则返回<code>true</code>
  497. */
  498. public final boolean isJavaVersionAtLeast(float requiredVersion) {
  499. return getVersionFloat() >= requiredVersion;
  500. }
  501. /**
  502. * 判定当前Java的版本是否大于等于指定的版本号。
  503. * <p>
  504. * 例如:
  505. * </p>
  506. * <ul>
  507. * <li>测试JDK 1.2:<code>isJavaVersionAtLeast(120)</code></li>
  508. * <li>测试JDK 1.2.1:<code>isJavaVersionAtLeast(131)</code></li>
  509. * </ul>
  510. *
  511. * @param requiredVersion 需要的版本
  512. * @return 如果当前Java版本大于或等于指定的版本,则返回<code>true</code>
  513. */
  514. public final boolean isJavaVersionAtLeast(int requiredVersion) {
  515. return getVersionInt() >= requiredVersion;
  516. }
  517. /**
  518. * 将Java Implementation的信息转换成字符串。
  519. *
  520. * @return JVM impl.的字符串表示
  521. */
  522. @Override
  523. public final String toString() {
  524. StringBuilder buffer = new StringBuilder();
  525. append(buffer, "Java Version: ", getVersion());
  526. append(buffer, "Java Vendor: ", getVendor());
  527. append(buffer, "Java Vendor URL: ", getVendorURL());
  528. return buffer.toString();
  529. }
  530. }
  531. /** 代表当前运行的JRE的信息。 */
  532. public static final class JavaRuntimeInfo {
  533. private final String JAVA_RUNTIME_NAME = getSystemProperty("java.runtime.name", false);
  534. private final String JAVA_RUNTIME_VERSION = getSystemProperty("java.runtime.version", false);
  535. private final String JAVA_HOME = getSystemProperty("java.home", false);
  536. private final String JAVA_EXT_DIRS = getSystemProperty("java.ext.dirs", false);
  537. private final String JAVA_ENDORSED_DIRS = getSystemProperty("java.endorsed.dirs", false);
  538. private final String JAVA_CLASS_PATH = getSystemProperty("java.class.path", false);
  539. private final String JAVA_CLASS_VERSION = getSystemProperty("java.class.version", false);
  540. private final String JAVA_LIBRARY_PATH = getSystemProperty("java.library.path", false);
  541. /** 防止从外界创建此对象。 */
  542. private JavaRuntimeInfo() {
  543. }
  544. /**
  545. * 取得当前JRE的名称(取自系统属性:<code>java.runtime.name</code>)。
  546. * <p>
  547. * 例如Sun JDK 1.4.2:
  548. * <code>"Java(TM) 2 Runtime Environment, Standard Edition"</code>
  549. * </p>
  550. *
  551. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  552. * @since Java 1.3
  553. */
  554. public final String getName() {
  555. return JAVA_RUNTIME_NAME;
  556. }
  557. /**
  558. * 取得当前JRE的版本(取自系统属性:<code>java.runtime.version</code>)。
  559. * <p>
  560. * 例如Sun JDK 1.4.2:<code>"1.4.2-b28"</code>
  561. * </p>
  562. *
  563. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  564. * @since Java 1.3
  565. */
  566. public final String getVersion() {
  567. return JAVA_RUNTIME_VERSION;
  568. }
  569. /**
  570. * 取得当前JRE的安装目录(取自系统属性:<code>java.home</code>)。
  571. * <p>
  572. * 例如Sun JDK 1.4.2:<code>"/opt/jdk1.4.2/jre"</code>
  573. * </p>
  574. *
  575. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  576. * @since Java 1.1
  577. */
  578. public final String getHomeDir() {
  579. return JAVA_HOME;
  580. }
  581. /**
  582. * 取得当前JRE的扩展目录列表(取自系统属性:<code>java.ext.dirs</code>)。
  583. * <p>
  584. * 例如Sun JDK 1.4.2:<code>"/opt/jdk1.4.2/jre/lib/ext:..."</code>
  585. * </p>
  586. *
  587. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  588. * @since Java 1.3
  589. */
  590. public final String getExtDirs() {
  591. return JAVA_EXT_DIRS;
  592. }
  593. /**
  594. * 取得当前JRE的endorsed目录列表(取自系统属性:<code>java.endorsed.dirs</code>)。
  595. * <p>
  596. * 例如Sun JDK 1.4.2:<code>"/opt/jdk1.4.2/jre/lib/endorsed:..."</code>
  597. * </p>
  598. *
  599. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  600. * @since Java 1.4
  601. */
  602. public final String getEndorsedDirs() {
  603. return JAVA_ENDORSED_DIRS;
  604. }
  605. /**
  606. * 取得当前JRE的系统classpath(取自系统属性:<code>java.class.path</code>)。
  607. * <p>
  608. * 例如:<code>"/home/admin/myclasses:/home/admin/..."</code>
  609. * </p>
  610. *
  611. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  612. * @since Java 1.1
  613. */
  614. public final String getClassPath() {
  615. return JAVA_CLASS_PATH;
  616. }
  617. /**
  618. * 取得当前JRE的系统classpath(取自系统属性:<code>java.class.path</code>)。
  619. * <p>
  620. * 例如:<code>"/home/admin/myclasses:/home/admin/..."</code>
  621. * </p>
  622. *
  623. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  624. * @since Java 1.1
  625. */
  626. public final String[] getClassPathArray() {
  627. return StringUtil.split(getClassPath(), getOsInfo().getPathSeparator());
  628. }
  629. /**
  630. * 取得当前JRE的class文件格式的版本(取自系统属性:<code>java.class.version</code>)。
  631. * <p>
  632. * 例如Sun JDK 1.4.2:<code>"48.0"</code>
  633. * </p>
  634. *
  635. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  636. * @since Java 1.1
  637. */
  638. public final String getClassVersion() {
  639. return JAVA_CLASS_VERSION;
  640. }
  641. /**
  642. * 取得当前JRE的library搜索路径(取自系统属性:<code>java.library.path</code>)。
  643. * <p>
  644. * 例如Sun JDK 1.4.2:<code>"/opt/jdk1.4.2/bin:..."</code>
  645. * </p>
  646. *
  647. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  648. * @since Java 1.2
  649. */
  650. public final String getLibraryPath() {
  651. return JAVA_LIBRARY_PATH;
  652. }
  653. /**
  654. * 取得当前JRE的library搜索路径(取自系统属性:<code>java.library.path</code>)。
  655. * <p>
  656. * 例如Sun JDK 1.4.2:<code>"/opt/jdk1.4.2/bin:..."</code>
  657. * </p>
  658. *
  659. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  660. * @since Java 1.2
  661. */
  662. public final String[] getLibraryPathArray() {
  663. return StringUtil.split(getLibraryPath(), getOsInfo().getPathSeparator());
  664. }
  665. /**
  666. * 取得当前JRE的URL协议packages列表(取自系统属性:<code>java.library.path</code>)。
  667. * <p>
  668. * 例如Sun JDK 1.4.2:<code>"sun.net.www.protocol|..."</code>
  669. * </p>
  670. *
  671. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  672. * @since Java 1.2
  673. */
  674. public final String getProtocolPackages() {
  675. return getSystemProperty("java.protocol.handler.pkgs", true);
  676. }
  677. /**
  678. * 将当前运行的JRE信息转换成字符串。
  679. *
  680. * @return JRE信息的字符串表示
  681. */
  682. @Override
  683. public final String toString() {
  684. StringBuilder buffer = new StringBuilder();
  685. append(buffer, "Java Runtime Name: ", getName());
  686. append(buffer, "Java Runtime Version: ", getVersion());
  687. append(buffer, "Java Home Dir: ", getHomeDir());
  688. append(buffer, "Java Extension Dirs: ", getExtDirs());
  689. append(buffer, "Java Endorsed Dirs: ", getEndorsedDirs());
  690. append(buffer, "Java Class Path: ", getClassPath());
  691. append(buffer, "Java Class Version: ", getClassVersion());
  692. append(buffer, "Java Library Path: ", getLibraryPath());
  693. append(buffer, "Java Protocol Packages: ", getProtocolPackages());
  694. return buffer.toString();
  695. }
  696. }
  697. /** 代表当前OS的信息。 */
  698. public static final class OsInfo {
  699. private final String OS_VERSION = getSystemProperty("os.version", false);
  700. private final String OS_ARCH = getSystemProperty("os.arch", false);
  701. private final String OS_NAME = getSystemProperty("os.name", false);
  702. private final boolean IS_OS_AIX = getOSMatches("AIX");
  703. private final boolean IS_OS_HP_UX = getOSMatches("HP-UX");
  704. private final boolean IS_OS_IRIX = getOSMatches("Irix");
  705. private final boolean IS_OS_LINUX = getOSMatches("Linux") || getOSMatches("LINUX");
  706. private final boolean IS_OS_MAC = getOSMatches("Mac");
  707. private final boolean IS_OS_MAC_OSX = getOSMatches("Mac OS X");
  708. private final boolean IS_OS_OS2 = getOSMatches("OS/2");
  709. private final boolean IS_OS_SOLARIS = getOSMatches("Solaris");
  710. private final boolean IS_OS_SUN_OS = getOSMatches("SunOS");
  711. private final boolean IS_OS_WINDOWS = getOSMatches("Windows");
  712. private final boolean IS_OS_WINDOWS_2000 = getOSMatches("Windows", "5.0");
  713. private final boolean IS_OS_WINDOWS_95 = getOSMatches("Windows 9", "4.0");
  714. private final boolean IS_OS_WINDOWS_98 = getOSMatches("Windows 9", "4.1");
  715. private final boolean IS_OS_WINDOWS_ME = getOSMatches("Windows", "4.9");
  716. private final boolean IS_OS_WINDOWS_NT = getOSMatches("Windows NT");
  717. private final boolean IS_OS_WINDOWS_XP = getOSMatches("Windows", "5.1");
  718. // 由于改变file.encoding属性并不会改变系统字符编码,为了保持一致,通过LocaleUtil取系统默认编码。
  719. private final String FILE_ENCODING = LocaleUtil.getSystem().getCharset().name();
  720. private final String FILE_SEPARATOR = getSystemProperty("file.separator", false);
  721. private final String LINE_SEPARATOR = getSystemProperty("line.separator", false);
  722. private final String PATH_SEPARATOR = getSystemProperty("path.separator", false);
  723. /** 防止从外界创建此对象。 */
  724. private OsInfo() {
  725. }
  726. /**
  727. * 取得当前OS的架构(取自系统属性:<code>os.arch</code>)。
  728. * <p>
  729. * 例如:<code>"x86"</code>
  730. * </p>
  731. *
  732. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  733. * @since Java 1.1
  734. */
  735. public final String getArch() {
  736. return OS_ARCH;
  737. }
  738. /**
  739. * 取得当前OS的名称(取自系统属性:<code>os.name</code>)。
  740. * <p>
  741. * 例如:<code>"Windows XP"</code>
  742. * </p>
  743. *
  744. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  745. * @since Java 1.1
  746. */
  747. public final String getName() {
  748. return OS_NAME;
  749. }
  750. /**
  751. * 取得当前OS的版本(取自系统属性:<code>os.version</code>)。
  752. * <p>
  753. * 例如:<code>"5.1"</code>
  754. * </p>
  755. *
  756. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  757. * @since Java 1.1
  758. */
  759. public final String getVersion() {
  760. return OS_VERSION;
  761. }
  762. /**
  763. * 判断当前OS的类型。
  764. * <p>
  765. * 如果不能取得系统属性<code>os.name</code>(因为Java安全限制),则总是返回<code>false</code>
  766. * </p>
  767. *
  768. * @return 如果当前OS类型为AIX,则返回<code>true</code>
  769. */
  770. public final boolean isAix() {
  771. return IS_OS_AIX;
  772. }
  773. /**
  774. * 判断当前OS的类型。
  775. * <p>
  776. * 如果不能取得系统属性<code>os.name</code>(因为Java安全限制),则总是返回<code>false</code>
  777. * </p>
  778. *
  779. * @return 如果当前OS类型为HP-UX,则返回<code>true</code>
  780. */
  781. public final boolean isHpUx() {
  782. return IS_OS_HP_UX;
  783. }
  784. /**
  785. * 判断当前OS的类型。
  786. * <p>
  787. * 如果不能取得系统属性<code>os.name</code>(因为Java安全限制),则总是返回<code>false</code>
  788. * </p>
  789. *
  790. * @return 如果当前OS类型为IRIX,则返回<code>true</code>
  791. */
  792. public final boolean isIrix() {
  793. return IS_OS_IRIX;
  794. }
  795. /**
  796. * 判断当前OS的类型。
  797. * <p>
  798. * 如果不能取得系统属性<code>os.name</code>(因为Java安全限制),则总是返回<code>false</code>
  799. * </p>
  800. *
  801. * @return 如果当前OS类型为Linux,则返回<code>true</code>
  802. */
  803. public final boolean isLinux() {
  804. return IS_OS_LINUX;
  805. }
  806. /**
  807. * 判断当前OS的类型。
  808. * <p>
  809. * 如果不能取得系统属性<code>os.name</code>(因为Java安全限制),则总是返回<code>false</code>
  810. * </p>
  811. *
  812. * @return 如果当前OS类型为Mac,则返回<code>true</code>
  813. */
  814. public final boolean isMac() {
  815. return IS_OS_MAC;
  816. }
  817. /**
  818. * 判断当前OS的类型。
  819. * <p>
  820. * 如果不能取得系统属性<code>os.name</code>(因为Java安全限制),则总是返回<code>false</code>
  821. * </p>
  822. *
  823. * @return 如果当前OS类型为MacOS X,则返回<code>true</code>
  824. */
  825. public final boolean isMacOsX() {
  826. return IS_OS_MAC_OSX;
  827. }
  828. /**
  829. * 判断当前OS的类型。
  830. * <p>
  831. * 如果不能取得系统属性<code>os.name</code>(因为Java安全限制),则总是返回<code>false</code>
  832. * </p>
  833. *
  834. * @return 如果当前OS类型为OS2,则返回<code>true</code>
  835. */
  836. public final boolean isOs2() {
  837. return IS_OS_OS2;
  838. }
  839. /**
  840. * 判断当前OS的类型。
  841. * <p>
  842. * 如果不能取得系统属性<code>os.name</code>(因为Java安全限制),则总是返回<code>false</code>
  843. * </p>
  844. *
  845. * @return 如果当前OS类型为Solaris,则返回<code>true</code>
  846. */
  847. public final boolean isSolaris() {
  848. return IS_OS_SOLARIS;
  849. }
  850. /**
  851. * 判断当前OS的类型。
  852. * <p>
  853. * 如果不能取得系统属性<code>os.name</code>(因为Java安全限制),则总是返回<code>false</code>
  854. * </p>
  855. *
  856. * @return 如果当前OS类型为Sun OS,则返回<code>true</code>
  857. */
  858. public final boolean isSunOS() {
  859. return IS_OS_SUN_OS;
  860. }
  861. /**
  862. * 判断当前OS的类型。
  863. * <p>
  864. * 如果不能取得系统属性<code>os.name</code>(因为Java安全限制),则总是返回<code>false</code>
  865. * </p>
  866. *
  867. * @return 如果当前OS类型为Windows,则返回<code>true</code>
  868. */
  869. public final boolean isWindows() {
  870. return IS_OS_WINDOWS;
  871. }
  872. /**
  873. * 判断当前OS的类型。
  874. * <p>
  875. * 如果不能取得系统属性<code>os.name</code>(因为Java安全限制),则总是返回<code>false</code>
  876. * </p>
  877. *
  878. * @return 如果当前OS类型为Windows 2000,则返回<code>true</code>
  879. */
  880. public final boolean isWindows2000() {
  881. return IS_OS_WINDOWS_2000;
  882. }
  883. /**
  884. * 判断当前OS的类型。
  885. * <p>
  886. * 如果不能取得系统属性<code>os.name</code>(因为Java安全限制),则总是返回<code>false</code>
  887. * </p>
  888. *
  889. * @return 如果当前OS类型为Windows 95,则返回<code>true</code>
  890. */
  891. public final boolean isWindows95() {
  892. return IS_OS_WINDOWS_95;
  893. }
  894. /**
  895. * 判断当前OS的类型。
  896. * <p>
  897. * 如果不能取得系统属性<code>os.name</code>(因为Java安全限制),则总是返回<code>false</code>
  898. * </p>
  899. *
  900. * @return 如果当前OS类型为Windows 98,则返回<code>true</code>
  901. */
  902. public final boolean isWindows98() {
  903. return IS_OS_WINDOWS_98;
  904. }
  905. /**
  906. * 判断当前OS的类型。
  907. * <p>
  908. * 如果不能取得系统属性<code>os.name</code>(因为Java安全限制),则总是返回<code>false</code>
  909. * </p>
  910. *
  911. * @return 如果当前OS类型为Windows ME,则返回<code>true</code>
  912. */
  913. public final boolean isWindowsME() {
  914. return IS_OS_WINDOWS_ME;
  915. }
  916. /**
  917. * 判断当前OS的类型。
  918. * <p>
  919. * 如果不能取得系统属性<code>os.name</code>(因为Java安全限制),则总是返回<code>false</code>
  920. * </p>
  921. *
  922. * @return 如果当前OS类型为Windows NT,则返回<code>true</code>
  923. */
  924. public final boolean isWindowsNT() {
  925. return IS_OS_WINDOWS_NT;
  926. }
  927. /**
  928. * 判断当前OS的类型。
  929. * <p>
  930. * 如果不能取得系统属性<code>os.name</code>(因为Java安全限制),则总是返回<code>false</code>
  931. * </p>
  932. *
  933. * @return 如果当前OS类型为Windows XP,则返回<code>true</code>
  934. */
  935. public final boolean isWindowsXP() {
  936. return IS_OS_WINDOWS_XP;
  937. }
  938. /**
  939. * 匹配OS名称。
  940. *
  941. * @param osNamePrefix OS名称前缀
  942. * @return 如果匹配,则返回<code>true</code>
  943. */
  944. private final boolean getOSMatches(String osNamePrefix) {
  945. if (OS_NAME == null) {
  946. return false;
  947. }
  948. return OS_NAME.startsWith(osNamePrefix);
  949. }
  950. /**
  951. * 匹配OS名称。
  952. *
  953. * @param osNamePrefix OS名称前缀
  954. * @param osVersionPrefix OS版本前缀
  955. * @return 如果匹配,则返回<code>true</code>
  956. */
  957. private final boolean getOSMatches(String osNamePrefix, String osVersionPrefix) {
  958. if (OS_NAME == null || OS_VERSION == null) {
  959. return false;
  960. }
  961. return OS_NAME.startsWith(osNamePrefix) && OS_VERSION.startsWith(osVersionPrefix);
  962. }
  963. /**
  964. * 取得OS的默认字符编码集(取自系统属性:<code>file.encoding</code>)。
  965. * <p>
  966. * 这个编码字符集将被作为当前JVM转换字节/字符的默认方式。 例如:<code>GBK</code>。
  967. * </p>
  968. *
  969. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  970. * @since Java 1.2
  971. */
  972. public final String getFileEncoding() {
  973. return FILE_ENCODING;
  974. }
  975. /**
  976. * 取得OS的文件路径的分隔符(取自系统属性:<code>file.separator</code>)。
  977. * <p>
  978. * 例如:Unix为<code>"/"</code>,Windows为<code>"\\"</code>。
  979. * </p>
  980. *
  981. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  982. * @since Java 1.1
  983. */
  984. public final String getFileSeparator() {
  985. return FILE_SEPARATOR;
  986. }
  987. /**
  988. * 取得OS的文本文件换行符(取自系统属性:<code>line.separator</code>)。
  989. * <p>
  990. * 例如:Unix为<code>"\n"</code>,Windows为<code>"\r\n"</code>。
  991. * </p>
  992. *
  993. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  994. * @since Java 1.1
  995. */
  996. public final String getLineSeparator() {
  997. return LINE_SEPARATOR;
  998. }
  999. /**
  1000. * 取得OS的搜索路径分隔符(取自系统属性:<code>path.separator</code>)。
  1001. * <p>
  1002. * 例如:Unix为<code>":"</code>,Windows为<code>";"</code>。
  1003. * </p>
  1004. *
  1005. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  1006. * @since Java 1.1
  1007. */
  1008. public final String getPathSeparator() {
  1009. return PATH_SEPARATOR;
  1010. }
  1011. /**
  1012. * 将OS的信息转换成字符串。
  1013. *
  1014. * @return OS的字符串表示
  1015. */
  1016. @Override
  1017. public final String toString() {
  1018. StringBuilder buffer = new StringBuilder();
  1019. append(buffer, "OS Arch: ", getArch());
  1020. append(buffer, "OS Name: ", getName());
  1021. append(buffer, "OS Version: ", getVersion());
  1022. append(buffer, "File Encoding: ", getFileEncoding());
  1023. append(buffer, "File Separator: ", getFileSeparator());
  1024. append(buffer, "Line Separator: ", getLineSeparator());
  1025. append(buffer, "Path Separator: ", getPathSeparator());
  1026. return buffer.toString();
  1027. }
  1028. }
  1029. /** 代表当前用户的信息。 */
  1030. public static final class UserInfo {
  1031. private final String USER_NAME = getSystemProperty("user.name", false);
  1032. private final String USER_HOME = getSystemProperty("user.home", false);
  1033. private final String USER_DIR = getSystemProperty("user.dir", false);
  1034. private final String USER_LANGUAGE = getSystemProperty("user.language", false);
  1035. private final String USER_COUNTRY = getSystemProperty("user.country", false) == null ? getSystemProperty(
  1036. "user.region", false) : getSystemProperty("user.country", false);
  1037. private final String JAVA_IO_TMPDIR = getSystemProperty("java.io.tmpdir", false);
  1038. /** 防止从外界创建此对象。 */
  1039. private UserInfo() {
  1040. }
  1041. /**
  1042. * 取得当前登录用户的名字(取自系统属性:<code>user.name</code>)。
  1043. * <p>
  1044. * 例如:<code>"admin"</code>
  1045. * </p>
  1046. *
  1047. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  1048. * @since Java 1.1
  1049. */
  1050. public final String getName() {
  1051. return USER_NAME;
  1052. }
  1053. /**
  1054. * 取得当前登录用户的home目录(取自系统属性:<code>user.home</code>)。
  1055. * <p>
  1056. * 例如:<code>"/home/admin"</code>
  1057. * </p>
  1058. *
  1059. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  1060. * @since Java 1.1
  1061. */
  1062. public final String getHomeDir() {
  1063. return USER_HOME;
  1064. }
  1065. /**
  1066. * 取得当前目录(取自系统属性:<code>user.dir</code>)。
  1067. * <p>
  1068. * 例如:<code>"/home/admin/working"</code>
  1069. * </p>
  1070. *
  1071. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  1072. * @since Java 1.1
  1073. */
  1074. public final String getCurrentDir() {
  1075. return USER_DIR;
  1076. }
  1077. /**
  1078. * 取得临时目录(取自系统属性:<code>java.io.tmpdir</code>)。
  1079. * <p>
  1080. * 例如:<code>"/tmp"</code>
  1081. * </p>
  1082. *
  1083. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  1084. * @since Java 1.2
  1085. */
  1086. public final String getTempDir() {
  1087. return JAVA_IO_TMPDIR;
  1088. }
  1089. /**
  1090. * 取得当前登录用户的语言设置(取自系统属性:<code>user.language</code>)。
  1091. * <p>
  1092. * 例如:<code>"zh"</code>、<code>"en"</code>等
  1093. * </p>
  1094. *
  1095. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  1096. * @since Java 1.2
  1097. */
  1098. public final String getLanguage() {
  1099. return USER_LANGUAGE;
  1100. }
  1101. /**
  1102. * 取得当前登录用户的国家或区域设置(取自系统属性:JDK1.4 <code>user.country</code>或JDK1.2
  1103. * <code>user.region</code>)。
  1104. * <p>
  1105. * 例如:<code>"CN"</code>、<code>"US"</code>等
  1106. * </p>
  1107. *
  1108. * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回<code>null</code>。
  1109. * @since Java 1.2
  1110. */
  1111. public final String getCountry() {
  1112. return USER_COUNTRY;
  1113. }
  1114. /**
  1115. * 将当前用户的信息转换成字符串。
  1116. *
  1117. * @return 用户信息的字符串表示
  1118. */
  1119. @Override
  1120. public final String toString() {
  1121. StringBuilder buffer = new StringBuilder();
  1122. append(buffer, "User Name: ", getName());
  1123. append(buffer, "User Home Dir: ", getHomeDir());
  1124. append(buffer, "User Current Dir: ", getCurrentDir());
  1125. append(buffer, "User Temp Dir: ", getTempDir());
  1126. append(buffer, "User Language: ", getLanguage());
  1127. append(buffer, "User Country: ", getCountry());
  1128. return buffer.toString();
  1129. }
  1130. }
  1131. /** 代表当前主机的信息。 */
  1132. public static final class HostInfo {
  1133. private final String HOST_NAME;
  1134. private final String HOST_ADDRESS;
  1135. /** 防止从外界创建此对象。 */
  1136. private HostInfo() {
  1137. String hostName;
  1138. String hostAddress;
  1139. try {
  1140. InetAddress localhost = InetAddress.getLocalHost();
  1141. hostName = localhost.getHostName();
  1142. hostAddress = localhost.getHostAddress();
  1143. } catch (UnknownHostException e) {
  1144. hostName = "localhost";
  1145. hostAddress = "127.0.0.1";
  1146. }
  1147. HOST_NAME = hostName;
  1148. HOST_ADDRESS = hostAddress;
  1149. }
  1150. /**
  1151. * 取得当前主机的名称。
  1152. * <p>
  1153. * 例如:<code>"webserver1"</code>
  1154. * </p>
  1155. *
  1156. * @return 主机名
  1157. */
  1158. public final String getName() {
  1159. return HOST_NAME;
  1160. }
  1161. /**
  1162. * 取得当前主机的地址。
  1163. * <p>
  1164. * 例如:<code>"192.168.0.1"</code>
  1165. * </p>
  1166. *
  1167. * @return 主机地址
  1168. */
  1169. public final String getAddress() {
  1170. return HOST_ADDRESS;
  1171. }
  1172. /**
  1173. * 将当前主机的信息转换成字符串。
  1174. *
  1175. * @return 主机信息的字符串表示
  1176. */
  1177. @Override
  1178. public final String toString() {
  1179. StringBuilder buffer = new StringBuilder();
  1180. append(buffer, "Host Name: ", getName());
  1181. append(buffer, "Host Address: ", getAddress());
  1182. return buffer.toString();
  1183. }
  1184. }
  1185. /** 将系统信息输出到指定<code>PrintWriter</code>中。 */
  1186. public static final void dumpSystemInfo() {
  1187. dumpSystemInfo(new PrintWriter(System.out));
  1188. }
  1189. /**
  1190. * 将系统信息输出到指定<code>PrintWriter</code>中。
  1191. *
  1192. * @param out <code>PrintWriter</code>输出流
  1193. */
  1194. public static final void dumpSystemInfo(PrintWriter out) {
  1195. out.println("--------------");
  1196. out.println(getJvmSpecInfo());
  1197. out.println("--------------");
  1198. out.println(getJvmInfo());
  1199. out.println("--------------");
  1200. out.println(getJavaSpecInfo());
  1201. out.println("--------------");
  1202. out.println(getJavaInfo());
  1203. out.println("--------------");
  1204. out.println(getJavaRuntimeInfo());
  1205. out.println("--------------");
  1206. out.println(getOsInfo());
  1207. out.println("--------------");
  1208. out.println(getUserInfo());
  1209. out.println("--------------");
  1210. out.println(getHostInfo());
  1211. out.println("--------------");
  1212. out.flush();
  1213. }
  1214. /**
  1215. * 取得系统属性,如果因为Java安全的限制而失败,则将错误打在<code>System.err</code>中,然后返回
  1216. * <code>null</code>。
  1217. *
  1218. * @param name 属性名
  1219. * @param quiet 安静模式,不将出错信息打在<code>System.err</code>中
  1220. * @return 属性值或<code>null</code>
  1221. */
  1222. private static String getSystemProperty(String name, boolean quiet) {
  1223. try {
  1224. return System.getProperty(name);
  1225. } catch (SecurityException e) {
  1226. if (!quiet) {
  1227. System.err.println("Caught a SecurityException reading the system property '" + name
  1228. + "'; the SystemUtil property value will default to null.");
  1229. }
  1230. return null;
  1231. }
  1232. }
  1233. /**
  1234. * 输出到<code>StringBuilder</code>。
  1235. *
  1236. * @param buffer <code>StringBuilder</code>对象
  1237. * @param caption 标题
  1238. * @param value 值
  1239. */
  1240. private static void append(StringBuilder buffer, String caption, String value) {
  1241. buffer.append(caption).append(defaultIfNull(StringEscapeUtil.escapeJava(value), "[n/a]")).append("\n");
  1242. }
  1243. public static void main(String[] args) {
  1244. dumpSystemInfo();
  1245. Set<?> keys = System.getProperties().keySet();
  1246. @SuppressWarnings("unchecked")
  1247. List<String> list = createArrayList((Set<String>) keys);
  1248. Collections.sort(list);
  1249. for (String key : list) {
  1250. String value = System.getProperty(key);
  1251. System.out.println(key + " = " + defaultIfNull(StringEscapeUtil.escapeJava(value), "[n/a]"));
  1252. }
  1253. }
  1254. }